比较魔性的题目 m<=2 所以最多只有两列 那么分m=1或2特判就好了
具体转移方程可直接看代码
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;
#define f(i,x,y) for (int i=x;i<=y;i++)
const int N=105;
int n,m,k;
int s[N][3],ans;
int work1(){
int f[N][N];
memset(f,-10,sizeof f);
f(i,0,n) f[i][0]=0;
f(i,1,n) f(j,1,k){
f[i][j]=f[i-1][j];
f(t,0,i-1) f[i][j]=max(f[i][j],f[t][j-1]+s[i][1]-s[t][1]); //
}
ans=f[n][k];
return 0;
}
int work2(){
int f[N][N][N];
memset(f,-10,sizeof f);
f(i,0,n) f(j,0,n) f[i][j][0]=0;
f(i,1,n) f(j,1,n) f(t,1,k){
f[i][j][t]=max(f[i-1][j][t],f[i][j-1][t]); //
f(p,0,i-1) f[i][j][t]=max(f[i][j][t],f[p][j][t-1]+s[i][1]-s[p][1]); //
f(p,0,j-1) f[i][j][t]=max(f[i][j][t],f[i][p][t-1]+s[j][2]-s[p][2]); //
if (i==j) f(p,0,i-1) f[i][j][t]=max(f[i][j][t],f[p][p][t-1]+s[i][1]-s[p][1]+s[i][2]-s[p][2]);
}
ans=f[n][n][k];
return 0;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
f(i,1,n) f(j,1,m)
scanf("%d",&s[i][j]),
s[i][j]+=s[i-1][j];
if (m==1) work1();
if (m==2) work2();
printf("%d",ans);
return 0;
}