最长上升子序列(动态规划)
最长上升子序列(动态规划)
给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 NN。
第二行包含 NN 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000,
\(−10^9\)≤数列中的数≤\(10^9\)
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
思想
-
状态表示:f[i]表示从第一个数字开始算,以a[i]结尾的最大的上升序列。(以a[i]结尾的所有上升序列中属性为最大值的那一个)
-
状态转换方程 f[i] = max(f[i], f[j] + 1), 其中j∈(0,1,2,..,i-1), 由于a[i]如果小于等于a[j],不满足题意,所以需判断。
-
有一个边界,若前面没有比i小的,f[i]为1(自己为结尾)。
-
最后f[i],表示每个到w[i]截止的最长子序列长度。
-
比较f[i]取最大值。
c++代码
#include <iostream>
using namespace std;
int main(){
int n;
int a[1000],f[1000];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int m=1;
for(int i=0;i<n;i++){
f[i]=1;
for(int j=0;j<i;j++){
if(a[j]<a[i]) f[i]=max(f[i],f[j]+1);//动态规划法 状态转移方程 f [ i ] = max (f [ i ], f[ j ] + 1);
}
m=max(m,f[i]);
}
cout<<m;
return 0;
}

浙公网安备 33010602011771号