这个题用dp[i][j]表示前i个数,以h[i]结尾,用了j次修改,最长的非递减序列。
但是这样直接dp的话如下
for(int i=1; i<=n; i++){
for(int j=0; j<=K; j++){
for(int a=0; a<i; a++){
for(int b=0; b<=j; b++){
if(h[i]+j-b>=h[a])
dp[i][j]=max(dp[i][j], dp[a][b]+1);
}
}
}
}
会超时。这个题巧妙的利用偏序关系,用二维树状数组将时间优化到n*k*logn*logk。
如果可以转移的话必须要满足h[i]+j-b>=h[a]的条件,也就是h[i]+j>=h[a]+b,前提是i>a,j>=b,这就有三个不等式,我们i是从前往后遍历所以i>a不予考虑,剩下