题目链接~~>
做题感悟:这题开始写的代码很挫,看别人的代码后才恍然大悟。
解题思路:记忆化搜索。
代码:
#include<stdio.h> #include<iostream> #include<map> #include<string> #include<string.h> #include<stdlib.h> #include<math.h> #include<vector> #include<queue> #include<algorithm> using namespace std ; const int INF = -99999999 ; const int MX= 1005 ; int n,k ; int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1} ; int dp[MX][MX],g[MX][MX] ; bool search(int x,int y) { if(x<0||y<0||x>=n||y>=n) // 大于等于 n!!! return false ; return true ; } int dfs(int x,int y) { if(dp[x][y]) return dp[x][y] ; int ans=0 ; for(int i=0 ;i<4 ;i++) for(int j=1 ;j<=k ;j++) { int sx=x+dx[i]*j ; int sy=y+dy[i]*j ; if(search(sx,sy)&&g[x][y]<g[sx][sy]) { int mx=dfs(sx,sy) ; ans= ans > mx ? ans : mx ; } } dp[x][y]=g[x][y]+ans ; return dp[x][y] ; } int main() { while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1) break ; memset(dp,0,sizeof(dp)) ; for(int i=0 ;i<n ;i++) for(int j=0 ;j<n ;j++) scanf("%d",&g[i][j]) ; printf("%d\n",dfs(0,0)) ; } return 0 ; }
原先代码~>