zoukankan      html  css  js  c++  java
  • 【BZOJ3594】【SCOI2014】方伯伯的玉米田(dp)

    传送门

    显然的一个性质就是每次拔高都拔高一段[x,n][x,n]最优

    考虑朴素dpdp
    f[i][j][k]f[i][j][k]表示前ii株玉米,拔高了jj次,当前最高的为kk的数量

    发现ii这一维没有用,可以直接省去
    考虑转移是每次找之前满足xh[i]+j,ykxle h[i]+j,yle kf[x][y]f[x][y]
    这就是一个二维前缀最大值
    树状数组维护一下就可以了

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
    	char ch=getchar();
    	int res=0,f=1;
    	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
    	return res;
    }
    const int N=10004;
    const int M=505;
    const int K=6005;
    inline void chemx(int &a,int b){
    	a=a>b?a:b;
    }
    int tr[K][M];
    #define lowbit(x) (x&(-x))
    inline void update(int x,int y,int k){
    	for(int i=x;i<=5500;i+=lowbit(i)){
    		for(int j=y;j<=501;j+=lowbit(j))
    			chemx(tr[i][j],k);
    	}
    }
    inline int query(int x,int y,int res=0){
    	for(int i=x;i;i-=lowbit(i)){
    		for(int j=y;j;j-=lowbit(j))
    			chemx(res,tr[i][j]);
    	}
    	return res;
    }
    int ans,n,k,h[N];
    int main(){
    	n=read(),k=read();
    	for(int i=1;i<=n;i++)h[i]=read();
    	for(int i=1;i<=n;i++){
    		for(int j=k;~j;j--){
    			int res=query(h[i]+j,j+1)+1;
    			chemx(ans,res);
    			update(h[i]+j,j+1,res);
    		}
    	}
    	cout<<ans;
    }
    
  • 相关阅读:
    python3-file的修改实现类似shell中sed的功能
    python3-字典的循环
    python3-file文件操作
    python3-字典的增删改查
    python3-字典中存储列表
    python3-字典中的一些常用方法
    python3-字典中包含字典
    报错调试和工具使用
    (三)、Struts第三天
    struts体系结构
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145590.html
Copyright © 2011-2022 走看看