제출 #1335324

#제출 시각아이디문제언어결과실행 시간메모리
1335324nathlol2건포도 (IOI09_raisins)C++20
100 / 100
71 ms30688 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 55, INF = 4e18;
int n, m, pf[N][N], dp[N][N][N][N];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> n >> m;
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            cin >> pf[i][j];
            pf[i][j] += pf[i - 1][j] + pf[i][j - 1] - pf[i - 1][j - 1];
        }
    }
    for(int ln1 = 1;ln1<=n;ln1++){
        for(int l1 = 1;l1 + ln1 - 1<=n;l1++){
            int r1 = l1 + ln1 - 1;
            for(int ln2 = 1;ln2<=m;ln2++){
                for(int l2 = 1;l2 + ln2 - 1<=m;l2++){
                    int r2 = l2 + ln2 - 1;
                    dp[l1][r1][l2][r2] = INF;
                    if(l1 == r1 && l2 == r2) dp[l1][r1][l2][r2] = 0;
                    for(int k = l1;k<r1;k++){
                        dp[l1][r1][l2][r2] = min(dp[l1][r1][l2][r2], dp[l1][k][l2][r2] + dp[k + 1][r1][l2][r2] + (pf[r1][r2] - pf[r1][l2 - 1] - pf[l1 - 1][r2] + pf[l1 - 1][l2 - 1]));
                    }
                    for(int k = l2;k<r2;k++){
                        dp[l1][r1][l2][r2] = min(dp[l1][r1][l2][r2], dp[l1][r1][l2][k] + dp[l1][r1][k + 1][r2] + (pf[r1][r2] - pf[r1][l2 - 1] - pf[l1 - 1][r2] + pf[l1 - 1][l2 - 1]));
                    }
                }
            }
        }
    }
    cout << dp[1][n][1][m];
}
#Verdict Execution timeMemoryGrader output
Fetching results...