#include<bits/stdc++.h>
#define N 104
#define M 4
#define K 14
using namespace std;
int n,m,k,ans=-INT_MAX;
int a[N][M];
int dp[N][K][3];
/*dp[][][i],i=
0 both
1 left
2 right
*/
void init(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
int main(){
init();
int op;
if(m^2)
for(int i=1;i<=n;i++)
for(int j=1;j<=min(k,i);j++){
dp[i][j][0]=dp[i-1][j][0];
for(int k=j-1;k<i;k++)
dp[i][j][0]=max(dp[i][j][0],dp[k][j-1][0]);
dp[i][j][0]+=a[i][1];
ans=max(ans,dp[i][j][0]);
}
else
for(int i=1;i<=n;i++)
for(int j=1;j<=min(k,i<<1);j++){
op=-INT_MAX;
dp[i][j][0]=dp[i-1][j][0];
dp[i][j][1]=dp[i-1][j][1];
dp[i][j][2]=dp[i-1][j][2];
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j][0]);
dp[i][j][2]=max(dp[i][j][2],dp[i-1][j][0]);
for(int k=j-1;k<i;k++){
op=max(op,dp[k][j-1][0]);
op=max(op,dp[k][j-1][1]);
op=max(op,dp[k][j-1][2]);
}
dp[i][j][0]=max(dp[i][j][0],op);
dp[i][j][1]=max(dp[i][j][1],op);
dp[i][j][2]=max(dp[i][j][2],op);
//dp[i][j][1]=max(dp[i][j][1],max(op,dp[i][j-1][2]));
//dp[i][j][2]=max(dp[i][j][2],max(op,dp[i][j-1][1]));
dp[i][j][0]+=a[i][1]+a[i][2];
dp[i][j][1]+=a[i][1];
dp[i][j][2]+=a[i][2];
}
for(int i=1;i<=n;i++){
ans=max(ans,dp[i][k][0]);
ans=max(ans,dp[i][k][1]);
ans=max(ans,dp[i][k][2]);
}
printf("%d",ans);
}
大概解释一下我的程序吧。
dp[i][j][k] 表示考虑到了第 i 行,选取了 j 个矩阵,k 的含义写在注释里了,就是第 i 行具体取了哪几个数。
ps:看了一下题解,发现大家在状态的表示中都有将“两列都选,且属于同一个矩阵”和“两列都选,但不属于同一个矩阵”作区分,但我没有QAQ
我的处理方法在第46、47行,也就是只选一个可以由两个都选转移而来。
不知道问题会不会出在这里,希望有大佬帮忙看看(给几组数据也好啊