标签:
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
解题思路
记忆化搜索就是搜索的时候要用动态规划来存储,也就是说是两者的结合。
状态转移方程:dp[x][y]=max(dp[x-1][y], dp[x+1][y], dp[x][y-1], dp[x][y+1])+1
程序代码:
#include<iostream> using namespace std; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; int n,m; int map[102][102]; int dp[102][102]; int dfs(int x,int y) { int tx,ty,i; if(dp[x][y]) //当已经搜索过时就返回 return dp[x][y]; for(i = 0;i < 4;i++) { tx = x + dir[i][0] , ty = y + dir[i][1]; if(tx >= 0 && tx < n && ty >= 0 && ty < m && map[tx][ty] < map[x][y])//搜索+ 状态转移方程 { int temp = dfs(tx,ty); //递归的出口有两个1.在11行;2.在16行 if(dp[x][y] <= temp) //i=0时比较dfs(x+1, y);i=1时比较dfs(x, y+1);i=2时比较dfs(x-1, y);i=3时比较dfs(x, y-1) { dp[x][y] = temp+1; } } } return dp[x][y]; } int main() { int i,j,t; while(cin >> n >> m) { for(i =0 ;i < n;i++) { for(j = 0;j < m;j++) { cin >> map[i][j]; dp[i][j] = 0; } } int max = -1; for(i = 0 ;i < n;i++) { for(j = 0;j < m;j++) { t = dfs(i,j); if(max < t) { max = t; } } } cout <<max + 1 << endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/xinxiangqing/p/4732707.html