最长上升子序列,又称LIS,是动态规划的一个经典应用。
在原序列取任意多项,不改变它们在原来数列的先后次序,得到的序列称为原序列的子序列。最长上升子序列,就是给定序列的一个最长的、数值从低到高的子序列,最长上升子序列不一定是唯一的。
输入样例:
8
2 1 5 3 6 4 6 3
输出样例:
4
解释:它的最长上升子序列为1,3,4,6和2,3,4,6,长度均为4
解题思路:
转移方程:
通过转移方程可以得到:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int list[100],n;
int dp[100],ans=0;
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&list[i]);
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(list[i]>list[j]) dp[i]=max(dp[i],dp[j]+1);
}
ans=max(dp[i],ans);
}
printf("%d",ans);
return 0;
}