#include<iostream>#include<algorithm>usingnamespace std;constint N =1010;
int n;int a[N], f[N];intmain(){scanf("%d",&n);for(int i =1; i <= n ; i++)scanf("%d",&a[i]);for(int i =1; i<= n ; i++){
f[i]=1;for(int j =1; j < i ; j++){if(a[j]< a[i])
f[i]=max(f[i], f[j]+1);}}/int res =0;for(int i =1; i <= n ; i++) res =max(res , f[i]);printf("%d\n", res);return0;}
最长公共子序列(acwing 897)
#include<iostream>#include<algorithm>usingnamespace std;constint N =1010;int n , m ;char a[N], b[N];int f[N][N];intmain(){scanf("%d%d",&n ,&m);scanf("%s%s", a +1, b +1);for(int i =1; i <= n ; i++){for(int j =1; j <= m ; j++){
f[i][j]=max(f[i -1][j], f[i][j -1]);if(a[i]== b[j]) f[i][j]=max(f[i][j], f[i -1][j -1]+1);}}printf("%d\n", f[n][m]);return0;}
石子合并(Acwing 282)
#include<iostream>#include<algorithm>usingnamespace std;constint N =310;int n ;int s[N];int f[N][N];intmain(){scanf("%d",&n);for(int i =1; i <= n ; i++)scanf("%d",&s[i]);for(int i =1; i <= n ; i++) s[i]+= s[i -1];for(int len =2; len <= n ; len++){for(int i =1; i + len -1<= n; i++){int l = i , r = i + len -1;
f[l][r]=1e8;for(int k = l ; k < r ; k++)
f[l][r]=min(f[l][r], f[l][k]+ f[k +1][r]+ s[r]- s[l -1]);}}printf("%d\n", f[1][n]);return0;}