254242026-02-20 00:24:46999Táblatöréscpp17Accepted 50/509ms2288 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> pref,v;
int dp[31][31][31][31];

int S(int b, int j, int f, int a){
    if(b>j||f>a)return 0;
    return pref[j][a]-pref[b-1][a]-pref[j][f-1]+pref[b-1][f-1];
}

int F(int b,int j, int f, int a){
	if(b>j||f>a)return 0;
	if(dp[b][j][f][a])return dp[b][j][f][a];
    int ossz=S(b,j,f,a),ans=0,w1=min({F(b+1,j,f,a),F(b,j-1,f,a),F(b,j,f+1,a),F(b,j,f,a-1)});
    ans=ossz-w1;
	dp[b][j][f][a]=ans;
	return ans;
}

int main() {
    int n,m;cin>>n>>m;
    v.resize(n+2,vector<int>(m+2));
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            cin>>v[i][j];
        }
    }
    pref.resize(n+2,vector<int>(m+2));
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            pref[i][j]=pref[i-1][j]+pref[i][j-1]+v[i][j]-pref[i-1][j-1];
        }
    }
    cout<<F(1,n,1,m)<<endl;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms500 KiB
2Accepted0/08ms2100 KiB
3Accepted2/21ms316 KiB
4Accepted2/21ms316 KiB
5Accepted1/11ms508 KiB
6Accepted1/11ms564 KiB
7Accepted1/13ms2104 KiB
8Accepted2/22ms1332 KiB
9Accepted3/32ms564 KiB
10Accepted3/33ms820 KiB
11Accepted3/34ms1588 KiB
12Accepted3/34ms1588 KiB
13Accepted4/47ms2152 KiB
14Accepted4/48ms2100 KiB
15Accepted4/48ms2104 KiB
16Accepted5/59ms2088 KiB
17Accepted5/58ms2100 KiB
18Accepted5/58ms2288 KiB
19Accepted1/19ms2100 KiB
20Accepted1/18ms2200 KiB