/*参考网上的代码,,DFS+DP
dp[x][y] = list[x][y] + max(所有下一步可以走的点的dp[nx][ny])
dp[0][0]是最终的答案,表示从起点到终点能吃的最大蛋糕数
因此,dp[x][y]是一个从终点到起点逆向递推的过程,
*/
#include <stdio.h>
#include <algorithm>
#include <cstring>using namespace std;
int dp[101][101];
int list[101][101];
int n, k, m;
int dir[][2] = {1,0, -1,0, 0,1, 0,-1};
int DFS(int x, int y)
{
int nx, ny, tmp1 = 0, tmp2 = 0;
if(!dp[x][y])
{
for(int i = 1; i <= k; i++)
{
for(int j = 0; j < 4; j++)
{
nx = x + dir[j][0]*i;
ny = y + dir[j][1]*i;
if(nx < 0 || nx >= n || ny < 0 || ny >= n)
continue;
if(list[nx][ny] > list[x][y])
{
tmp1 = DFS(nx, ny);
tmp2 = max(tmp1, tmp2); //将所有可以走的点都试探一次,然后取最大值
}
}
}
dp[x][y] = list[x][y] + tmp2; //加上自己的
}
return dp[x][y];
}int main()
{
while(scanf("%d%d", &n, &k) && n > 0)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &list[i][j]);
memset(dp, 0, sizeof(dp));
int ans = DFS(0,0);
printf("%d\n", ans);
}
return 0;
}
FatMouse and Cheese HDU - 1078(DFS+DP)
最新推荐文章于 2024-07-30 10:30:00 发布