1 3 8 9 10 10 10 10 -10 10 10 10 -11 -1 0 2 11 10 -20 -11 -11 10 11 2 10 -10 -10
52
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; #define N 25 #define M 1005 #define INF -99999 int map[N][M],dp[N][M]; int main() { int i,n,m,t,j,k; while(cin>>t) { while(t--) { cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>map[i][j]; for(i=0;i<=n;i++) dp[i][0]=INF; //存在负数,如果赋值为零,极有可能会从边界外面取值了。而且样例也可以过。 for(i=0;i<=m;i++) dp[0][i]=INF; dp[0][1]=dp[1][0]=0; //原点是一个特殊情况,他的值只有从边界外面取值,所以它的取值只能为零了。 for(i=1;i<=n;i++) //前阶段是在处理特殊情况的初始化。 for(j=1;j<=m;j++) { //注意,现在dp里面是一个空表,数值都在map里面。 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); for(k=2;k<=m;k++) if(j/k==(double)j/k) dp[i][j]=max(dp[i][j],dp[i][j/k]); dp[i][j]+=map[i][j]; //之前的dp[i][j]是可以到达该点的运气值最大的那个值,现在要加上该点的值。 } cout<<dp[n][m]<<endl; } } return 0; }
HDU 2571 命运 (动规),布布扣,bubuko.com
原文:http://blog.csdn.net/qq2256420822/article/details/38302497