标签:
每组測试数据输出一行。输出一个整数,代表依据最优的打法,你走到右上角时能够获得的最大金币数目。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define inf 0x3f3f3f3f; #define maxn 110 using namespace std; int dp[maxn][maxn]; int ma[maxn][maxn]; int n,m; void DP(int c) { for(int i=1;i<=n;i++) { int temp=dp[i][c-1]+ma[i][c]; dp[i][c]=max(dp[i][c],temp); for(int j=i+1;j<=n;j++) { temp+=ma[j][c]; dp[j][c]=max(dp[j][c],temp); } } for(int i=n;i>=1;i--) { int temp=dp[i][c-1]+ma[i][c]; dp[i][c]=max(dp[i][c],temp); for(int j=i-1;j>=1;j--) { temp+=ma[j][c]; dp[j][c]=max(dp[j][c],temp); } } } int main() { int t;cin>>t; int c=1; while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&ma[i][j]); dp[i][j]=-inf; } dp[1][1]=ma[1][1]; for(int i=2;i<=n;i++) dp[i][1]=dp[i-1][1]+ma[i][1]; for(int j=2;j<=m;j++) DP(j); printf("Case #%d:\n",c++); printf("%d\n",dp[1][m]); } return 0; }
版权声明:欢迎follow我的开源项目:https://github.com/skyqinsc
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4826581.html