hdu 2571 命运 (记忆化搜索)
2012-05-09 11:23
225 查看
题目分析:定义dp[x][y]为从位置(i,j)走所能取得最大幸运值:
dp[x][y]=max(dp[x+1][y], dp[x][y+1],dp[x][y*k])+maze[x][y]...........(x+1<=n y+1<=m y*k<=m)
注意:
1.注意初始化 dp
[m]=maze
[m];
dp[x][y]=max(dp[x+1][y], dp[x][y+1],dp[x][y*k])+maze[x][y]...........(x+1<=n y+1<=m y*k<=m)
注意:
1.注意初始化 dp
[m]=maze
[m];
//******记忆化搜索 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int minf=-200000000; int maze[25][1100],n,m,dp[25][1000];//dp[x][y]是代表从位置(i,j)走所能得到的最大幸运值 int dfs(int x,int y) { //int ans=minf; if(dp[x][y]!=minf) return dp[x][y]; int ans=minf; if((y+1<=m)/*&&dfs(x,y+1)>ans*/)//向右 { if(dfs(x,y+1)>ans) ans=dfs(x,y+1); } if((x+1<=n)/*&&dfs(x+1,y)>ans*/)//向下 { if(dfs(x+1,y)>ans) ans=dfs(x+1,y); } for(int k=2;k*y<=m;k++) if(dfs(x,y*k)>ans) ans=dfs(x,y*k); dp[x][y]=ans+maze[x][y]; return dp[x][y]; } int main() { int C; scanf("%d",&C); while(C--) { scanf("%d %d",&n,&m); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&maze[i][j]); dp[i][j]=minf; } dp [m]=maze [m]; dfs(1,1); int ans=dp[1][1]; /* for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%d ",dp[i][j]); printf("\n"); }*/ printf("%d\n",ans); } system("pause"); return 0; }
相关文章推荐
- HDU - 2571 命运 —— 01背包
- HDU dp 2571 命运
- hdu 2571 命运
- HDU 2571 命运
- HDU 2571 命运 (简单DP)
- HDU 2571 命运(DP)
- HDU 2571 命运——DP
- HDU 2571(命运)动态规划-数塔问题
- HDU 2571 命运
- HDU 2571 命运
- HDU 2571 命运(简单DP)
- HDU 2571 命运(DP)
- hdu 2571 命运【dp】
- 【HDU】2571 - 命运(dp)
- HDU 2571 命运
- HDU 2571 命运
- hdu 2571 命运 简单DP
- HDU 2571 命运 (dp)
- HDU 2571 命运 DP
- HDU—2571 命运