3 1 1 2 5 10 11 6 12 12 7 -1 -1
37
普通搜索 会超时的 感觉这道题和滑雪(poj1088,nyoj10)一样 只不过多了一些方向
首先附上超时代码 +理解错误(He eats up the cheese where he stands and then runs either horizontally or vertically to another location.)
#include <stdio.h>
#include <string.h>
int n,k;
int map[105][105];
bool vis[105][105];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int max;
bool limit(int x1,int y1,int x,int y)
{
if(vis[x1][y1]||x1<0||y1<0||x1>=n||y1>=n||map[x1][y1]<=map[x][y])
return false;
return true;
}
void dfs(int x,int y,int sum)
{
if(sum>max)
max=sum;
for(int i=0;i<k;i++)
{
for(int j=0;j<4;j++)
{
int x1=x+dir[j][0];
int y1=y+dir[j][1];
if(limit(x1,y1,x,y))
{
vis[x1][y1]=true;
sum+=map[x1][y1];
dfs(x1,y1,sum);
vis[x1][y1]=false;
sum-=map[x1][y1];
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&k))
{
if(n==-1&&k==-1)
break;
memset(map,0,sizeof(map));
memset(vis,false,sizeof(vis));
if(k>n+n)
k=n+n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
max=0;
vis[0][0]=true;
dfs(0,0,map[0][0]);
printf("%d\n",max);
}
return 0;
}理解为可以任意走k步了 Wa也是应该的
记忆化搜索:
#include <stdio.h>
#include <string.h>
#include <queue>
#include <math.h>
using namespace std;
int n,k,result;
int map[105][105];
int dp[105][105];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
int x,y;
};
bool limit(int x1,int y1,int x,int y)
{
if(x1<0||y1<0||x1>=n||y1>=n||map[x1][y1]<=map[x][y])
return false;
return true;
}
int dfs(int x,int y)
{
if(dp[x][y])
return dp[x][y];
for(int i=1;i<=k;i++)
{
for(int j=0;j<4;j++)
{
int x1=x+dir[j][0]*i;
int y1=y+dir[j][1]*i;
if(limit(x1,y1,x,y))
{
int z=dfs(x1,y1);
if(dp[x][y]<z+map[x1][y1])
dp[x][y]=z+map[x1][y1];
}
}
}
return dp[x][y];
}
int main()
{
while(~scanf("%d %d",&n,&k))
{
if(n==-1&&k==-1)
break;
result=0;
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
printf("%d\n",dfs(0,0)+map[0][0]);
}
return 0;
}hdu 1078 FatMouse and Cheese(记忆化搜索)
原文:http://blog.csdn.net/su20145104009/article/details/51135611