您的位置:首页 > 其它

HDU 1078 FatMouse and Cheese【记忆化搜索】

2015-03-08 15:09 357 查看
题意:给出n*n的二维矩阵,和k,老鼠每次最多走k步,问老鼠从起点(0,0)出发,能够得到的最大的数(即为将每走过一点的数都加起来的和最大)是多少

和上一题滑雪一样,搜索的方向再加一个循环

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<algorithm>
using namespace std;

typedef long long LL;
int a[1005][1005],d[1005][1005],n,k;
int dir[4][2]={1,0,-1,0,0,1,0,-1};

int dfs(int x,int y){
if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算
int ans=0;
for(int j=1;j<=k;j++){
for(int i=0;i<4;i++){ //四个 方向搜
int nx=x+dir[i][0]*j;
int ny=y+dir[i][1]*j;
if(nx<0||nx>=n||ny<0||ny>=n) continue;//越界
if(a[x][y]<a[nx][ny])
ans=max(ans,dfs(nx,ny));
}
}

return d[x][y]=ans+a[x][y];
}

int main()
{
while(scanf("%d %d",&n,&k)!=EOF&&n!=-1&&k!=-1){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) cin>>a[i][j];

memset(d,0,sizeof(d));

printf("%d\n",dfs(0,0));
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: