codeforces1468A LaIS

https://codeforces.com/contest/1468/problem/A
这个题是在原本lis的基础上的升级版...
之前一直思考这个题必须得存储最后两个数的信息才能进行状态转移....好吧是我的动态规划还不是太好...
我们还是先考虑最原始的DP,f[i]表示以a[i]结尾的最长的长度。
转移的时候可以考虑分类讨论,以a[i]结尾无外乎两种情况,我们令上一个数为a[j],上上一个为a[k].
1.a[j]<=a[i].在这种情况下,我们发现无论a[k]是什么值,我们都能直接向a[j]后面加上a[i].即
f[i]=max(f[j]+1),(1<=j<=i-1,且a[i]>=a[j])。
2.a[j]>a[i].在这种情况下,我们可以发现a[k]<=a[i]才行。但我们的状态没有记录上上一个数的信息,怎么办?其中一个解决办法就是直接从a[k]转移到a[j],相当于我们直接在a[k]的后面直接加上a[j]与a[i]。发现都是可以加上去的。但我们必须保证他们之间的相对关系是正确的。即:
f[i]=max(f[k]+2),(1<=k<=i-2,且a[i]>=a[k],在[k+1,i-1]之间存在a[j]>=a[i]).
第一个情况,我们可以直接用权值线段树即可。第二种情况,我们可以先找到离a[i]最近的大于等于a[i]的a[j],之后可以在[1,j-1]间找最大值。发现这个题又有权值限制,又有位置限制,可以用主席树进行维护。

点击查看代码

上一篇:C++ STL记录


下一篇:力扣算法学习day35-1