HDU1087
1 /*记忆化dfs+dp,因为每次最多走k步,所以上下左右的方向有所扩展, 2 dp[i][j]存的是从dp[i][j]出发能吃的最大个数*/ 3 #include<stdio.h> 4 #include<string.h> 5 #include<algorithm> 6 using namespace std; 7 const int maxn=110; 8 int map[maxn][maxn],vis[maxn][maxn]; 9 int dp[maxn][maxn];//dp[i][j]表示从i,j出的最大蛋糕数目 10 int n,m,k; 11 void init() 12 { 13 memset(dp,0,sizeof(dp)); 14 memset(vis,0,sizeof(vis)); 15 } 16 int dfs(int x,int y) 17 { 18 if(dp[x][y]) return dp[x][y]; 19 int i,j; 20 dp[x][y]=map[x][y]; 21 for(i=1;i<=k;i++) 22 { 23 if(x-i>=1 && map[x-i][y]>map[x][y]) 24 { 25 dp[x][y]=max(dp[x][y],dfs(x-i,y)+map[x][y]); 26 } 27 if(x+i<=n && map[x+i][y]>map[x][y]) 28 { 29 dp[x][y]=max(dp[x][y],dfs(x+i,y)+map[x][y]); 30 } 31 if(y-i>=1 && map[x][y-i]>map[x][y]) 32 { 33 dp[x][y]=max(dp[x][y],dfs(x,y-i)+map[x][y]); 34 } 35 if(y+i<=n && map[x][y+i]>map[x][y]) 36 { 37 dp[x][y]=max(dp[x][y],dfs(x,y+i)+map[x][y]); 38 } 39 } 40 return dp[x][y]; 41 } 42 int main() 43 { 44 int i,j; 45 while(scanf("%d%d",&n,&k)!=EOF) 46 { 47 if(n==-1 && k==-1) break; 48 for(i=1;i<=n;i++) 49 for(j=1;j<=n;j++) 50 scanf("%d",&map[i][j]); 51 init(); 52 printf("%d\n",dfs(1,1)); 53 } 54 return 0; 55 }