본문으로 바로가기

백준 11660 - 구간 합 구하기 5

category BOJ 백준/Dynamic Programming 2020. 11. 14. 19:54

출처 : https://www.acmicpc.net/problem/11660 

 

11660번: 구간 합 구하기 5

첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네

www.acmicpc.net

 

고려사항

  • 입출력 시간 줄이기...cstdio printf scanf 를 쓰거나, sync_with_false 를 쓰는 습관을 들여야하는데...
    (사실 여지껏 응시한 코테에서는 위와 같은 제한 사항은 없다...)
  • x줄에서 각각의 y 좌표까지의 구간합 정보를 memo 에 저장한다.
  • 41 - 45 라인의 방식으로 정답 도출.

 

#include <iostream>
using namespace std;

int board[1025][1025];
int memo[1025][1025];

int dp(int x, int y){
    int &v = memo[x][y];

    if(y == 0){
        return 0;
    }

    if(v != 0){
        return v;
    }

    for(int i=1;i<=y;++i){
        v += board[x][i];
    }

    return v;
}

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    
    int n, m, x1, x2, y1, y2, sum;
    cin>>n>>m;

    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            cin>>board[i][j];
        }
    }

    for(int i=0;i<m;++i){
        cin>>x1>>y1>>x2>>y2;

        sum = 0;
        for(int j=x1;j<=x2;++j){
            sum += (dp(j, y2) - dp(j, y1-1));
        }
        cout<<sum<<"\n";
    }
    return 0;
}

'BOJ 백준 > Dynamic Programming' 카테고리의 다른 글

백준 09252 - LCS 2  (0) 2020.12.30
백준 02407 - 조합  (0) 2020.11.15
백준 02156 - 포도주 시식  (0) 2020.10.27
백준 10844 - 쉬운 계단 수  (0) 2020.10.26
백준 01463 - 1로 만들기  (0) 2020.10.26