思路:按照之前的分析方法
1.先分解出子问题
1.1 不符合要求的子问题
前n个元素的最长子序列情况可能不唯一,其终点大小可能不同,第n+1个元素加入后,受前面状态的影响,可能变长,也可能不变。
1.2 符号无后效性的子问题
2.确定状态
位置相关,状态由位置表示。
3.状态转移方程
maxlen(k) 它的长度就是在以i=0~k-1为终点,且a[i]<a[k]的最长子序列长度+1
代码:
try
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAX 1000
int maxlen[MAX]; //保存状态结果
int a[MAX]; //保存序列
using namespace std;
int main(){
int n; //输入序列的长度
cin>>n;
for(int i=0;i<n;++i){
cin>>a[i];
maxlen[i]=1; //初始化各状态为1 即默认a[k]自己最长
}
for(int i=1;i<n;++i){ //求a[i]为终点的最长子序列长度 maxlen[0]肯定为1略过
for(int j=0;j<i;++j) // 查看前面的最长子序列
if(a[i]>a[j]){ //a[i]可以加到该子序列后
maxlen[i]=max(maxlen[i],maxlen[j]+1); //递推公式
}
}
cout<<*max_element(maxlen,maxlen+n); //max_element返回的是迭代器 加*得到元素值
return 0;
}