기억보다는 기록을 해볼까

[BOJ] 구간 합 구하기-5 1160(C++) - 39 일차 본문

백준으로 C++ 공부하기

[BOJ] 구간 합 구하기-5 1160(C++) - 39 일차

옥상에서 2021. 12. 20. 16:29
728x90

문제

 

11660번: 구간 합 구하기 5

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

www.acmicpc.net

생각

다이내믹 프로그래밍

간단하게 생각하면 답이 나온다.

다만 입력값이 워낙 많아서 

ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

를 입력 해주자

코드

#include <iostream>
using namespace std;

const int MAXN = 1025;
int map[MAXN][MAXN] ={0, };
int dp[MAXN][MAXN] ={0, };

int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n; cin >> n;
    int m; cin >> m;

    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            cin >> map[i][j];
        }
    }
    dp[1][1] = map[1][1];
    dp[1][2] = map[1][2];
    dp[2][1] = map[2][1];
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - 1] + map[i][j];
        }
    }

    while(m--) {
        int sty, stx;
        cin >> sty >> stx;

        int endy, endx;
        cin >> endy >> endx;

        int sum = 0;
        sum = dp[endy][endx] - dp[endy][stx - 1] - dp[sty - 1][endx] + dp[sty - 1][stx - 1];
        cout << sum << "\n";
    }
}
728x90
Comments