0
点赞
收藏
分享

微信扫一扫

【HDU1078】dfs+dp

看山远兮 2022-07-04 阅读 12

1.​​题目链接​​。题目大意:有一个方格,每个格子中储存了一定数量的食物,老鼠在这个格子上吃食物,它可以上下左右四个方向走,每次最多走k步,并且下一步格子储存的食物一定要比当前所在的这个格子的数量多。那么求解老鼠最多可以吃到多少食物。

2.5555,这题虽然不难,但是有点坑,写了半天。。。。首先时坐标合法性检查的问题,一定要线检查坐标是不是在格子内,再检查是不是可以走。否则就会re。。。再者就是dfs,不知道为啥,第一次的dfs一直wa,然后重新写了一个莫名其妙的A了。好吧。。

#include<bits/stdc++.h>
int mp[200][200];
int dp[200][200];
int n, k;
#pragma warning(disable:4996)
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
int dfs(int x, int y)
{
int maxx = 0, dx, dy, ans;
if (!dp[x][y])
{
for (int i = 1; i <= k; i++)
{
for (int j = 0; j<4; j++)
{
dx = x + dir[j][0] * i;
dy = y + dir[j][1] * i;
if (dx>=0&&dx<n&&dy>=0&&dy<n&&mp[dx][dy]>mp[x][y])
{
ans = dfs(dx, dy);
if (ans>maxx)
maxx = ans;
}
}
}
dp[x][y] = maxx + mp[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));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &mp[i][j]);
printf("%d\n",dfs(0,0));
}
}

 


举报

相关推荐

0 条评论