zoukankan      html  css  js  c++  java
  • BZOJ 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田

    Time Limit: 60 Sec  Memory Limit: 128 MB
    Submit: 1281  Solved: 569
    [Submit][Status][Discuss]

    Description

    方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。
    这排玉米一共有N株,它们的高度参差不齐。
    方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。
    方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作。拔玉米则可以随意选择一个集合的玉米拔掉。
    问能最多剩多少株玉米,来构成一排美丽的玉米。

    Input


    第1行包含2个整数n,K,分别表示这排玉米的数目以及最多可进行多少次操作。
    第2行包含n个整数,第i个数表示这排玉米,从左到右第i株玉米的高度ai。

    Output


    输出1个整数,最多剩下的玉米数。

    Sample Input

    3 1
    2 1 3

    Sample Output

    3

    HINT

    1 < N < 10000,1 < K ≤ 500,1 ≤ ai ≤5000 

    Source

    By 佚名提供

    分析:

    首先由一个性质:我们每一次选择一个区间进行一次操作,这个区间的右端点一定是在最右端的...

    这样我们就可以DP,因为我们如果选择除了若干个确定的位置,我们可以计算得出最后一个点的操作次数...

    $f[i][j]$代表前$i$个位置,进行了$j$次操作的最优值...

    $f[i][j]=max{f[x][y]+1} (x<i AND a[x]+y<=a[i]+j)$

    发现这是一个三维偏序,可以二维树状数组优化...

    代码:

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    //by NeighThorn
    using namespace std;
    
    const int maxn=10000+5,maxk=500+5,maxm=5000+500+5;
    
    int n,k,ans,Max,a[maxn],f[maxn][maxk],M[maxm][maxk];
    
    inline void insert(int x,int y,int v){
    	for(int i=x;i<=Max;i+=i&-i)
    		for(int j=y;j<=k+1;j+=j&-j)
    			M[i][j]=max(M[i][j],v);
    }
    
    inline int query(int x,int y){
    	int res=0;
    	for(int i=x;i;i-=i&-i)
    		for(int j=y;j;j-=j&-j)
    			res=max(res,M[i][j]);
    	return res;
    }
    
    signed main(void){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]),Max=max(Max,a[i]);Max+=k+1;
    	for(int i=1;i<=n;i++)
    		for(int j=k+1;j;j--){
    			f[i][j]=query(a[i]+j,j)+1;
    			insert(a[i]+j,j,f[i][j]);
    			ans=max(ans,f[i][j]);
    		}
    	printf("%d
    ",ans);
    	return 0;
    }
    

      


    By NeighThorn

  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/neighthorn/p/6656905.html
Copyright © 2011-2022 走看看