【HDU2571】命运
2012-04-29 01:19
253 查看
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> using namespace std; const int MAXN = 100; const int MAXM = 1100; int maze[MAXN][MAXM]; int dp[MAXN][MAXM]; int solve(int n,int m,int N,int M) { //向下一次只能走一格。但是如果向右走,则每次可以走一格或者走到该行的列数是当前所在列数倍数的格子 if(dp [m] != -10000000) return dp [m]; int res = maze [m]; //@WA Point!!! origin: ///下一步可以是(x+1,y),(x,y+1)或者(x,y*k) if( m - 1 > 0 && m <= M ) ///左 res = solve(n,m-1,N,M)+maze [m]; ///origin: res= max(res,solve(n,m-1,N,M)+maze [m]); if( n - 1 > 0 && n <= N ) ///上 res = max(res,solve(n-1,m,N,M)+maze [m]); for(int k = m - 1 ; k > 0 && m <= M ; k--) { if( m % k == 0 ) { res = max(res,solve(n,k,N,M)+maze [m]); } } return dp [m] = res; } int main() { #ifndef ONLINE_JUDGE freopen("B:\\acm\\DP1\\E.txt","r",stdin); #endif int T = 0 , N = 0, M = 0; while(scanf("%d",&T) != EOF) { memset(maze,0,sizeof(maze)); for(int i = 0 ; i < T ;i++) { scanf("%d%d",&N,&M); for(int n = 1 ; n <= N ; n++) { for(int m = 1 ; m <= M ; m++) { scanf("%d",&maze [m]); dp [m] = -10000000; } } solve(N,M,N,M); /*for(int n = 1 ; n <= N ; n++) { for(int m = 1; m <= M ; m++) { printf("%d ",dp [m]); } printf("\n"); }*/ printf("%d\n",dp [M]); } } return 0; }
题目中状态给的很明显啊
dp[i][j] = max
{ maze[i][j] + dp[i][k] // j % k == 0
, dp[i-1][j]+maze[i][j]
,dp[i][j-1]+maze[i][j]
}
问题很可能出现在maze[i][j]+dp[i][k]上。
update:
问题不是出在maze[i][j]+dp[i][k]上,而是出在三个取值全用了max上,res的默认值是maze[i][j],如果数据是全负的的话那就根本不加了!!!
警钟啊!!
相关文章推荐
- DP激情奉献(五)hdu2571命运
- hdu2571 命运 简单dp
- hdu2571命运 DP
- hdu2571命运(dp)
- HDU2571:命运(DP)
- hdu1176免费馅饼&&hdu2571命运 经典DP
- HDU2571:命运(DP)
- HDU2571--命运---DP
- hdu2571 命运(DP)
- 动态规划——命运(hdu2571)
- HDU2571 命运(DP)
- hdu2571 命运
- HDU2571 命运(简单DP)
- DP——HDU2571:命运(DP)
- 动态规划:HDU2571-命运
- hdu2571 命运
- hdu2571 命运
- hdu2571 命运
- hdu2571 命运
- hdu2571 命运 动态规划Dp