动态规划专题5:最长上升子序列
描述
给定一个长度为 N 的整数序列 A
找到一组最长的整数序列 x 满足:
1 <= x1 < x2 < ... < xk <= N
A[x1] < A[x2] < ... < A[xk]
即寻找 A 的一个最长子序列,满足:
该子序列中每个元素递增
输入描述
第一行一个整数N(N<=1000) 表示长度,第二行 N个数 A[i]表示序列里面的数,每个数不超过int范围。
输出描述
一行 表示最长递增子序列的长度
用例输入 1
6 1 6 2 5 4 7
用例输出 1
4
例1中,最长上升子序列为:
1 6 2 5 4 7 或
1 6 2 5 4 7。
利用线性动态规划。
#include <bits/stdc++.h>
using namespace std;
int s[1010],dp[1010],mx,n;
int main(){cin>>n;if(n==1){//特判cout<<1;return 0;}for(int i=1;i<=n;i++){//每个格子都是一个上升子序列cin>>s[i];dp[i]=1;}for(int i=2;i<=n;i++){for(int j=1;j<i;j++){if(s[i]>s[j]){dp[i]=max(dp[i],dp[j]+1);mx=max(mx,dp[i]);//只要前面格子的值比它小,他与前面那个格子所组成的上升子序列即为前一个格子所组成的上升子序列加上当前的格子}}}cout<<mx;return 0;
}