标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 88560 | Accepted: 33212 |
Description
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Input
Output
Sample Input
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Sample Output
25
Source
以前真是太水了。。竟然是看了解题报告觉得好神奇 前几个月的咸鱼,现在叫菜鸟吧2333
重写一遍,一个记忆化搜索的基础题。
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; const int N = 105; int mp[N][N]; int dp[N][N]; ///dp[i][j]保存的是当前点能划最远的距离 int n,m; int dir[][2] ={{1,0},{-1,0},{0,1},{0,-1}}; int dfs(int x,int y){ int ans = 0; if(dp[x][y]>1) return dp[x][y]; ///记忆化搜索:已经搜过剪枝 for(int i=0;i<4;i++){ int nextx = x+dir[i][0]; int nexty = y+dir[i][1]; if(nextx<1||nextx>n||nexty<1||nexty>m) continue; if(mp[nextx][nexty]<mp[x][y]){ ans = max(ans,dfs(nextx,nexty)); } } dp[x][y]=ans+1; ///子问题的解加上1就是当前点的解 return dp[x][y]; } int main() { while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&mp[i][j]); dp[i][j] = 1; ///初始化每个点的高度为自身 } int ans = -1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ dfs(i,j); if(dp[i][j]>ans) ans = dp[i][j]; } } printf("%d\n",ans); } }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5384343.html