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 }