bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】
2018-10-29 16:44
393 查看
设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树状数组维护即可
#include<iostream> #include<cstdio> using namespace std; const int N=20005; int n,k,m,a ,t [505],f [505]; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } void update(int x,int y,int v) { for(int i=x;i<=m;i+=i&-i) for(int j=y;j<=k+1;j+=j&-j) t[i][j]=max(t[i][j],v); } int ques(int x,int y) { int r=0; for(int i=x;i;i-=i&-i) for(int j=y;j;j-=j&-j) r=max(r,t[i][j]); return r; } int main() { n=read(),k=read(); for(int i=1;i<=n;i++) a[i]=read(),m=max(m,a[i]); m+=k; int ans=0; for(int i=1;i<=n;i++) for(int j=k;j>=0;j--) { f[i][j]=max(f[i][j],ques(j+a[i],j+1)+1); update(j+a[i],j+1,f[i][j]); ans=max(f[i][j],ans); } printf("%d\n",ans); return 0; }
相关文章推荐
- 【bzoj3594[Scoi2014]方伯伯的玉米田】动规+二维树状数组
- bzoj 3594: [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
- 【二维树状数组优化dp】[Scoi2014] bzoj3594方伯伯的玉米田
- [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
- [BZOJ]3594 [SCOI2014] 方伯伯的玉米田 二维树状数组 + dp
- BZOJ 3594 [Scoi2014]方伯伯的玉米田(二维树状数组)
- bzoj3594 [Scoi2014]方伯伯的玉米田
- 【BZOJ3594】【SCOI2014】 方伯伯的玉米田
- BZOJ3594: [Scoi2014]方伯伯的玉米田
- 【bzoj 3594】[Scoi2014]方伯伯的玉米田
- bzoj 3594: [Scoi2014]方伯伯的玉米田
- BZOJ 3594 Scoi2014 方伯伯的玉米田 树状数组
- [BZOJ3594] [Scoi2014]方伯伯的玉米田
- BZOJ3594 [Scoi2014]方伯伯的玉米田 【树状数组优化dp】
- [bzoj3594][Scoi2014]方伯伯的玉米田 树状数组优化dp
- BZOJ 3594 [Scoi2014]方伯伯的玉米田 动态规划+二维树状数组
- bzoj 3594 [Scoi2014]方伯伯的玉米田(DP+二维BIT)
- 【SCOI2014】【BZOJ3594】方伯伯的玉米田
- bzoj3594 [Scoi2014]方伯伯的玉米田
- 【bzoj3594】 SCOI2014方伯伯的玉米田 dp+二维树状数组优化