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
",dfs(1,1));
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/okboy/p/3269216.html