DP+二维树状数组
显然一次操作[l,r]不优于操作[l,n],然后就可以DP。方程是一个三维前缀最大值,套上二维树状数组即可。
发生了一些奇怪的事,我这么傻比,有救吗?
#include<cstdio>
#include<cstring>
#define N 10005
#define K 505
#define A 5555
#define lowbit(_i) (_i&-_i)
#define cmax(u,v) ((u)<(v)?(u)=(v):0)
using namespace std;
namespace runzhe2000
{
struct BIT
{
int t[A][K];
int query(int x, int y)
{
int r = 0;
for(int i = x; i; i -= lowbit(i))
for(int j = y; j; j -= lowbit(j))
cmax(r, t[i][j]);
return r;
}
void modify(int x, int y, int v)
{
for(int i = x; i < A; i += lowbit(i))
for(int j = y; j < K; j += lowbit(j))
cmax(t[i][j], v);
}
}bit;
int n, k, a[N], f[N][K], ans;
void main()
{
scanf("%d%d",&n,&k); for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
for(int i = 1; i <= n; i++)
{
for(int j = k; ~j; j--)
{
f[i][j] = bit.query(a[i]+j+1, j+1) + 1;
cmax(ans, f[i][j]); bit.modify(a[i]+j+1, j+1, f[i][j]);
}
}
printf("%d\n",ans);
}
}
int main()
{
runzhe2000::main();
}