hdu 1078

 1 #include<iostream>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int A[150][150];
 6 int dp[150][150];
 7 int maxv=0;
 8 int n,m;
 9 int tr[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};//上下左右
10 int Find(int x,int y)
11 {
12     if(dp[x][y]!=0) return dp[x][y];
13     for(int i=0; i<4; i++)
14     {
15         for(int j=1; j<=m; j++)
16         {
17             int x1,y1;
18             if(tr[i][0]==1)
19             {
20                 x1=x+j;
21                 y1=y;
22             }
23             if(tr[i][0]==-1)
24             {
25                 x1=x-j;
26                 y1=y;
27             }
28             if(tr[i][1]==-1)
29             {
30                 x1=x;
31                 y1=y-j;
32             }
33             if(tr[i][1]==1)
34             {
35                 x1=x;
36                 y1=y+j;
37             }
38             if(x1>=1&&x1<=n&&y1>=1&&y1<=n&&A[x][y]<A[x1][y1])
39             {
40                 dp[x][y]=max(Find(x1,y1)+A[x1][y1],dp[x][y]);
41             }
42         }
43     }
44     return dp[x][y];
45 }
46 int main()
47 {
48 
49     while(cin>>n>>m)
50     {
51         maxv=0;
52         if(n==-1&&m==-1) break;
53         memset(dp,0,sizeof(dp));
54         memset(A,0,sizeof(A));
55         for(int i=1; i<=n; i++)
56         {
57             for(int j=1; j<=n; j++)
58             {
59                 cin>>A[i][j];
60             }
61         }
62         Find(1,1);
63         cout<<dp[1][1]+A[1][1]<<endl;
64     }
65 
66 }
原文地址:https://www.cnblogs.com/Yinchen-One/p/8387158.html