hdu 2571 命运 (记忆化搜索)

来源:互联网 发布:性价比高的鼠标 知乎 编辑:程序博客网 时间:2024/05/16 11:59

题目分析:定义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[n][m]=maze[n][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[n][m]=maze[n][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;}