#include<iostream>#include<cstdio>usingnamespace std;int a[101010];int dp[101010];intmain(){int n;scanf("%d",&n);for(int i =1; i <= n; i ++){scanf("%d",&a[i]);}for(int i =1; i <= n; i ++){
dp[i]=1;for(int j =1; j <= i; j ++){if(a[i]> a[j]){
dp[i]=max(dp[i], dp[j]+1);}}}int mx =0;for(int i =1; i <= n; i ++){
mx =max(mx, dp[i]);}printf("%d\n", mx);return0;}
2. 数塔问题
#include<iostream>#include<cstdio>usingnamespace std;int a[1010][1010];int dp[1010][1010];intmain(){int n;scanf("%d",&n);for(int i =1; i <= n; i ++){for(int j =1; j <= i; j ++){scanf("%d",&a[i][j]);}}for(int i =1; i <= n; i ++){for(int j =1; j <= i; j ++){
dp[i][j]=max(dp[i -1][j], dp[i -1][j -1])+ a[i][j];}}int mx =0;for(int i =1; i <= n; i ++){
mx =max(mx, dp[n][i]);}printf("%d\n", mx);return0;}
3. 三色染色问题
#include<iostream>#include<cstdio>usingnamespace std;longlong dp[100]={0,3,6,6};intmain(){int n;scanf("%d",&n);for(int i =4; i <= n; i ++){
dp[i]= dp[i -1]+ dp[i -2]*2;}printf("%lld\n", dp[n]);return0;}
4. 走楼梯
#include<iostream>#include<cstdio>usingnamespace std;longlong dp[55]={0,1,2};intmain(){int n;scanf("%d",&n);for(int i =3; i <= n; i ++){
dp[i]= dp[i -1]+ dp[i -2];}printf("%lld\n", dp[n]);return0;}
5. 平面上的彗星折线运行轨道
#include<iostream>#include<cstdio>usingnamespace std;longlong dp[100010]={0,1};intmain(){int n;scanf("%d",&n);for(int i =2; i <= n *2; i ++){
dp[i]= dp[i -1]+ i -1;}printf("%lld\n", dp[2* n]);return0;}
6. 子段和的最大值
#include<iostream>#include<cstdio>usingnamespace std;int dp[501010];intmain(){int n;scanf("%d",&n);for(int i =1; i <= n; i ++){int x;scanf("%d",&x);
dp[i]=max(dp[i -1]+ x, x);}int mx =0;for(int i =1; i <= n; i ++){
mx =max(mx, dp[i]);}printf("%d\n", mx);return0;}