hdu 1078 FatMouse and Cheese_记忆搜索
做这类型的搜索比较少,看懂题意花了半天
题意:给你个n*n的图,老鼠一次最远走k步,老鼠起初在(0,0),每次偷吃的东西必须比之前偷吃的要大。
#include<iostream> #include<cstdio> using namespace std; #define N 110 int map[N][N],dp[N][N]; int n,k; int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}}; int solve(int x,int y) { int i,j,max=0,sum,tx,ty; if(dp[x][y]) return dp[x][y]; for(i=0;i<4;i++) for(j=1;j<=k;j++) { tx=x+dir[i][0]*j; ty=y+dir[i][1]*j; if(tx>=0&&tx<n&&ty>=0&&ty<n&&map[tx][ty]>map[x][y]) { sum=solve(tx,ty); if(sum>max) max=sum; } } return dp[x][y]=max+map[x][y]; } int main() { int i,j; while(scanf("%d%d",&n,&k)!=EOF&&(n+k!=-2)) { for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%d",&map[i][j]); dp[i][j]=0; } printf("%d\n",solve(0,0)); } return 0; }
不怕路长,只怕心老.