转载请注明出处:http://blog.csdn.net/u012860063
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
3 1 1 2 5 10 11 6 12 12 7 -1 -1
37
题目大意:
有一个地图,上面有正整数值,然后要求从(0, 0)点出发,每次只能走向比当前点值更大的点,并且每次可以向四个方向走最多k步,要求走到最后所能得到的最大值。
解题思路:
由于题目要求有四个方向可以走,所以想到搜索,而要求走得最优解。所以可以用记忆化搜索。动态规划基础题,不过相当经典。
代码如下:(93ms)
| Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
| 10907677 | 2014-06-26 10:55:49 | Accepted | 1078 | 93MS | 392K | 910 B | G++ | 天资4747tym |
#include <cstdio>
#include <cstring>
int dp[147][147],map[147][147];
int n,k;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
int DFS(int x,int y)
{
int ans = 0,MAX = 0;
if(!dp[x][y])
{
for(int i = 1; i <= k; i++)
{
for(int j = 0; j < 4; j++)
{
int dx = x+xx[j]*i;
int dy = y+yy[j]*i;
if(dx>=0 && dx<n && dy>=0 && dy<n && map[x][y]<map[dx][dy])
{
ans = DFS(dx,dy);//每条路径能吃到的奶酪量
if(ans > MAX)
MAX = ans;
}
}
dp[x][y] = MAX+map[x][y];//从dp[x][y]开始能吃到的最大奶酪量
}
}
return dp[x][y];
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n == -1 && k == -1)
break;
memset(dp,0,sizeof(dp));
memset(map,0,sizeof(map));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d",&map[i][j]);
}
}
int TT = DFS(0,0);
printf("%d\n",TT);
}
return 0;
}
hdu1078 FatMouse and Cheese(记忆化搜索),布布扣,bubuko.com
hdu1078 FatMouse and Cheese(记忆化搜索)
原文地址:http://blog.csdn.net/u012860063/article/details/34815165