您的位置:首页 > 其它

HDU 1078 FatMouse and Cheese 记忆化搜索DP

2015-12-04 17:19 323 查看
直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555

因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解

但是复杂的拓补关系无法简单的用循环实现,所以直接采取记忆化搜索的方式进行DP,成功避免重叠子问题,避免超时

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int dp[105][105];
int a[105][105];
int n,k;
int dx[4]= {0,0,1,-1};
int dy[4]= {-1,1,0,0};
int dfs(int x,int y)
{
int maxc=0;
if(!dp[x][y])
{
for(int i=0; i<4; ++i)
{
for(int j=1; j<=k; j++)
{
int p=x+dx[i]*j;
int q=y+dy[i]*j;
if(p<0||p>=n||q<0||q>=n)break;
if(a[p][q]<=a[x][y])continue;
maxc=max(maxc,dfs(p,q));
}
}
dp[x][y]=a[x][y]+maxc;
}
return dp[x][y];
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==k&&n==-1)
break;
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a[i][j]);
printf("%d\n",dfs(0,0));
}
return 0;
}


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