用动态规划求一个序列的最长严格递增子序列,将求整个序列的最长严格递增子序列分解成求以每个数字为结尾的最长严格递增子序列,最后取最大即可。
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
int dp[n]; //存放以每个点作为结尾的递增子序列的长度!!!注意不要再用dp[n]={1}啦!!会出错!虽然我也不知道为什么
for(int i=0;i<n;i++){cin>>a[i]; dp[i]=1;} //可以输入顺便赋值dp初始值
//思路:从1开始到n-1遍历,作为锚点。然后每个点循环一次,循环从0到锚点前一个,若该点小于锚点且该点的dp大于等于锚点的dp,则锚点dp=该点dp+1; !!注意锚点一直在该点的后方!
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(a[j]<a[i]&&dp[j]>=dp[i]) dp[i]=dp[j]+1;
}
}
int max=1;
for(int i=0;i<n;i++) if(dp[i]>max) max=dp[i];
cout<<max;
}