LIS——最长递增子序列问题
最长递增子序列,举一个例子:
A={5,6,7,4,2,8,3},它的最长递增子序列是5,6,7,8.
转载一下大佬写的吧,大佬写的真的好,好好学习一下,认真体会:https://blog.csdn.net/ltrbless/article/details/81318935
真题实战:http://lx.lanqiao.cn/problem.page?gpid=T73。
这个题我们要知道一点:
最少下降子序列的个数(最少的拦截系统)=最长不下降子序列的长度(重点)
我采取的dp做法,所以就用dp来讲讲:
#include<bits/stdc++.h> using namespace std; int dp[2010];//统计可以最多可以拦截多少导弹 int up[2010];//统计最少几台拦截装置 int ans,cnt;//分别对应上面 int a[2010],n; int main() { ios::sync_with_stdio(false); while(1) { scanf("%d",&a[n++]); char b=getchar(); if(b=='\n') break; } for(register int i=0;i<n;i++) { dp[i]=1; up[i]=1; for(register int j=0;j<i;j++) { if(a[i]<a[j])//下降子序列 { dp[i]=max(dp[i],dp[j]+1); } else//最长不下降子序列=下降子序列的个数 { up[i]=max(up[i],up[j]+1); } } ans=max(ans,dp[i]); cnt=max(cnt,up[i]); } cout<<ans<<endl<<cnt; return 0; }
对于上面问题的证明罗勇军老师的书里已经有严格证明,膜拜大佬就完事了
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/15890959.html