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 }