您的位置:首页 > 其它

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

2017-02-27 16:13 477 查看
/*
记忆化搜索
P - FatMouse and Cheese
题意: 从(0,0)出发,每次最多走k格,但每次只能往
值比它现在在的值大的格子走。
题解:dp[i][j] 代表走到(i,j)的最大总值。
dp[i][j] = max(dp[prei][prej]+mp[i][j]){i,j 是 prei,prej能走到的格子}
贡献1T,1Wa,注意题意走K步是只能笔直走K步,导致T。
我以为我nextx是不断更新的,没乘j,导致wa。
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int N = 110;

int n,k;
int dx[5] = {0,0,1,-1};
int dy[5] = {1,-1,0,0};
int mp

,v

;
int dp

;
bool pan(int i,int j)
{
if(i >= 0 && i < n && j >= 0 && j < n)
return true;
return false;
}
int DFS(int x,int y)
{
int &ans = dp[x][y];
if(v[x][y])   return ans;
ans = mp[x][y];
v[x][y] = 1;
for(int i = 0; i < 4; i++)
{
for(int j = 1; j <= k; j++)
{
int nextx = x+dx[i]*j,nexty = y+dy[i]*j;
if(pan(nextx,nexty) && mp[x][y] < mp[nextx][nexty])
ans = max(ans,DFS(nextx,nexty)+mp[x][y]);
}
}
return ans;
}
int main()
{
while(cin >> n >> k)
{
if(n == -1 && k == -1)
break;
memset(dp,0,sizeof(dp));
memset(mp,0,sizeof(mp));
memset(v,0,sizeof(v));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d",&mp[i][j]);
int ans = DFS(0,0);
cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: