248792026-02-16 11:46:05abcdTáblatöréscpp17Accepted 50/5018ms2836 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn=31;
int dp[maxn][maxn][maxn][maxn];
bool vis[maxn][maxn][maxn][maxn];
int table[maxn][maxn];

int solve(int a,int b,int c,int d){
    if(a>b||c>d)return 0;
    if(vis[a][b][c][d])return dp[a][b][c][d];
    vis[a][b][c][d]=true;
    int sum=0,best=INT_MIN;
    for(int i=c;i<=d;i++)sum+=table[a][i];
    best=max(best,sum-solve(a+1,b,c,d));
    sum=0;
    for(int i=c;i<=d;i++)sum+=table[b][i];
    best=max(best,sum-solve(a,b-1,c,d));
    sum=0;
    for(int i=a;i<=b;i++)sum+=table[i][c];
    best=max(best,sum-solve(a,b,c+1,d));
    sum=0;
    for(int i=a;i<=b;i++)sum+=table[i][d];
    best=max(best,sum-solve(a,b,c,d-1));
    return dp[a][b][c][d]=best;
}

int main(){
    int n,m;cin>>n>>m;
    int total=0;
    for(int i=0;i<n;i++)for(int j=0;j<m;j++){
        cin>>table[i][j];
        total+=table[i][j];
    }
    int advantage=solve(0,n-1,0,m-1);
    cout<<(total+advantage)/2<<'\n';
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms500 KiB
2Accepted0/014ms2612 KiB
3Accepted2/21ms316 KiB
4Accepted2/21ms316 KiB
5Accepted1/11ms316 KiB
6Accepted1/11ms564 KiB
7Accepted1/13ms2612 KiB
8Accepted2/22ms1588 KiB
9Accepted3/31ms820 KiB
10Accepted3/34ms1208 KiB
11Accepted3/38ms1948 KiB
12Accepted3/38ms2104 KiB
13Accepted4/414ms2684 KiB
14Accepted4/414ms2544 KiB
15Accepted4/418ms2784 KiB
16Accepted5/517ms2660 KiB
17Accepted5/518ms2812 KiB
18Accepted5/517ms2656 KiB
19Accepted1/118ms2836 KiB
20Accepted1/118ms2640 KiB