DP函数优化
这种优化方式不难理解,不难想象,之前做过的一道题中记录了这种做法,通常用来优化线性DP,最长上升子序列
设
注意如果a[i]<a[j]并且d[i]=d[j]那么对于后续状态k(k>i&&k>j)来说,i不会比j差,所以我们只需要保留i这个状态,一定不会损失最优解
因此对于相同的d,只需要保留a[i]就好了
所以可以用lower_bound函数进行优化
这样的结果只能求长度,很难输出具体的序列,但是能完成动态规划
int main()
{
memset(g.0x3f,sizeof(g));
for(int i=1;i<=n;i++)
{
int k=lower_bound(g+1,g+1+n,a[i])-g;
d[i]=k;
g[k]=a[i];
ans=max(ans,d[i]);
}
}