求一个长度为n的最长上升子序列的长度(LIS),即对于任意的i<j都满足a[i]<a[j]的子序列;
思路:通过dp求解,我们首先定义:dp[i]=以a[i]为末尾的最长上升子序列的长度;
则以a[i]结尾的上升子序列是:
1)只包含a[i]的子序列
2)在满足j<i并且a[j]<a[i]的以以a[j]为结尾的上升子列末尾,追加上a[i]后得到的子序列
这二者之一,即状态转移方程是:dp[i]=max{dp[i],dp[j]+1|j<i且a[j]<a[i]}
时间复杂度:O(n^2)
代码:
//输入
int n;
int a[max_n];
int dp[max_n];//dp数组
void solve(){
int res=0;
for(int i=0;i<n;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+1);
res=max(res,dp[i]);//更新
}
printf("%d\n",res);
}