dp的问题除了递推过程的设计之外 还有数据结构的选择以及怎样合理的填充数据 这个的填充是个坑。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF -10000000
int mapp[105][105];
int dp[2][105][105];
int main()
{
int t,cnt=0;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&mapp[i][j]);
for(int i=0;i<2;i++)
for(int j=0;j<105;j++)
for(int k=0;k<105;k++)
dp[i][j][k]=INF;
dp[0][0][1]=0;
for(int i=1;i<=n;i++)// 游戏规则
dp[0][i][1]=dp[1][i][1]=dp[0][i-1][1]+mapp[i][1];
for(int j=2;j<=m;j++)//这里强调遍历列而不是行
for(int i=1;i<=n;i++)
{
dp[0][i][j]=dp[1][i][j]=max(dp[0][i][j-1],dp[1][i][j-1])+mapp[i][j];
for(int k=i;k<=n;k++)
dp[0][k][j]=max(dp[0][k][j],dp[0][k-1][j]+mapp[k][j]);
for(int k=i;k>=1;k--)
dp[1][k][j]=max(dp[1][k][j],dp[1][k+1][j]+mapp[k][j]);
}
printf("Case #%d:\n%d\n",++cnt,max(dp[0][1][m],dp[1][1][m]));
}
return 0;
}