dp——poj1088(Description)

dp可以按照思想大致分为两种,一种是递推的形式,一种是递归的形式(记忆化搜素)。

比如求这个题因为无法知道从哪个点开始,所以只能用递归的形式,因为有一个回溯的过程。

但是很多题目既可以用递推也可以用递归。

最简单举例:Fibonacci数列

递推形式:f[1]=1;f[2]=1;f[n]=f[n-1]+f[n-2];(3-->n)

递归形式:n=<2;return 1; f(n)=f(n-1)+f(n-2);

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9 #include <cmath>
10 #include <stack>
11 #include <queue>
12 #define lson l,m,rt<<1
13 #define rson m+1,r,rt<<1|1
14 using namespace std;
15 const double Pi=3.14159265358979323846;
16 typedef long long ll;
17 const int MAXN=100+5;
18 const int dx[4]={0,0,1,-1};
19 const int dy[4]={1,-1,0,0};
20 const int INF = 0x3f3f3f3f;
21 const int NINF = 0xc0c0c0c0;
22 const ll mod=1e9+7;
23 int dp[MAXN][MAXN];
24 int s[MAXN][MAXN];
25 int m,n;
26 int f(int a,int b)
27 {
28     if(dp[a][b]!=0) return dp[a][b];
29     for(int i=0;i<4;i++)
30     {
31         int x=a+dx[i];
32         int y=b+dy[i];
33         if(x>=1&&x<=m&&y>=1&&y<=n&&s[x][y]<s[a][b])
34         {
35             dp[a][b]=max(dp[a][b],f(x,y)+1);
36         }
37     }
38     return dp[a][b];
39 }
40 
41 int main()
42 {
43     scanf("%d%d",&m,&n);
44     for(int i=1;i<=m;i++)
45         for(int j=1;j<=n;j++)
46             {
47                 scanf("%d",&s[i][j]);
48                 dp[i][j]=0;
49             }
50 
51     int ans=0;
52     for(int i=1;i<=m;i++)
53         for(int j=1;j<=n;j++)
54         {
55             ans=max(ans,f(i,j));
56         }
57 
58     cout <<ans+1<<endl;
59             
60             
61     return 0;
62 }

 

 

posted @ 2019-03-12 22:45  Chuhanjing  阅读(140)  评论(0编辑  收藏  举报