您的位置:首页 > 其它

hdu 1078 记忆化搜索

2017-09-01 19:39 316 查看
给定一张N*N的图,每个格子上有一些豆子,初始位置是(0,0),每次只能向一个方向走最多m步,然后停下吃掉这个格子上的豆子,但有个限制是当前格子上的豆子必须比之前呆的一个格子里的豆子多,问最多能吃多少豆子。

#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
int dp[2005][2005];
int a[1005][1005];
int n,k;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int dfs(int x,int y)
{
int ans=0;
if(!dp[x][y])
{
for(int i=1;i<=k;i++)
{
for(int j=0;j<4;j++)
{
int xx=x+dir[j][0]*i;
int yy=y+dir[j][1]*i;
if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]>a[x][y])
{
ans=max(dfs(xx,yy),ans);
}
}
}
return dp[x][y]=ans+a[x][y];
}
return dp[x][y];
}
int main()
{

while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)
return 0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
memset(dp,0,sizeof(dp));
int ans=dfs(0,0);
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: