HDU 4826 (分类DP)
Labyrinth
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1368 Accepted Submission(s):
574
每组数据的第一行输入两个正整数m,n(m<=100,n<=100)。接下来的m行,每行n个整数,分别代表相应格子中能得到金币的数量,每个整数都大于等于-100且小于等于100。
每组测试数据输出一行,输出一个整数,代表根据最优的打法,你走到右上角时可以获得的最大金币数目。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int N,M,e[105][105],dp[105][105][2];
int solve()
{
int i,j,k;
memset(dp,-inf,sizeof(dp)); dp[0][1][0]=0;
for(i=1;i<=N;++i) dp[i][1][0]=dp[i-1][1][0]+e[i][1];
for(i=2;i<=M;++i)
{
for(j=N;j>=1;j--) dp[j][i][1]=max(dp[j+1][i][1],max(dp[j][i-1][0],dp[j][i-1][1]))+e[j][i];
for(j=1;j<=N;j++) dp[j][i][0]=max(dp[j-1][i][0],max(dp[j][i-1][0],dp[j][i-1][1]))+e[j][i];
}
return max(dp[1][M][0],dp[1][M][1]);
}
int main()
{
int t,i,j,k;
cin>>t;
for(int tes=1;tes<=t;++tes){
cin>>N>>M;
for(i=1;i<=N;++i)
for(j=1;j<=M;++j) scanf("%d",&e[i][j]);
printf("Case #%d:\n%d\n",tes,solve());
}
return 0;
}