248792026-02-16 11:46:05abcdTáblatöréscpp17Elfogadva 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';
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/01ms500 KiB
2Elfogadva0/014ms2612 KiB
3Elfogadva2/21ms316 KiB
4Elfogadva2/21ms316 KiB
5Elfogadva1/11ms316 KiB
6Elfogadva1/11ms564 KiB
7Elfogadva1/13ms2612 KiB
8Elfogadva2/22ms1588 KiB
9Elfogadva3/31ms820 KiB
10Elfogadva3/34ms1208 KiB
11Elfogadva3/38ms1948 KiB
12Elfogadva3/38ms2104 KiB
13Elfogadva4/414ms2684 KiB
14Elfogadva4/414ms2544 KiB
15Elfogadva4/418ms2784 KiB
16Elfogadva5/517ms2660 KiB
17Elfogadva5/518ms2812 KiB
18Elfogadva5/517ms2656 KiB
19Elfogadva1/118ms2836 KiB
20Elfogadva1/118ms2640 KiB