bzoj3594: [Scoi2014]方伯伯的玉米田
二维树状数组优化dp,复杂度又O(n maxa k) 变成 O(n log(maxa k))
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int maxn,n,k,a[10010],ans,tmp; struct BIT { int c[6060][550]; inline int lowbit(int x) { return x&-x; } void update(int x,int y,int val) { for(int i=x;i<=maxn+k;i+=lowbit(i)) for(int j=y;j<=k+1;j+=lowbit(j)) c[i][j]=max(c[i][j],val); } int get(int x,int y) { int res=0; for(int i=x;i;i-=lowbit(i)) for(int j=y;j;j-=lowbit(j)) res=max(res,c[i][j]); return res; } }bit; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); maxn=max(maxn,a[i]); } for(int i=1;i<=n;i++) for(int j=k;~j;j--) { //printf("t%d %d\n",i,j); tmp=bit.get(a[i]+j,j+1)+1; ans=max(ans,tmp); bit.update(a[i]+j,j+1,tmp); } printf("%d\n",ans); return 0; }