zoukankan      html  css  js  c++  java
  • [SCOI2014]方伯伯的玉米田

    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

    显然一次增加的区间肯定是[x,n],即以n为右端点

    于是DP

    f[i][j]表示到了i,提高了j次

    f[i][j]=max(f[l][k])+1

    要求便是a[i]+j-k>=a[l]

    所以a[i]+j>=a[l]+k且j>=k

    因为k不大

    所以维护一个2维树状数组转移

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 int c[6001][510],a[10001],sz,n,k;
     8 void add(int x,int y,int v)
     9 {int i,j;
    10     for (i=x;i<=sz;i+=(i&(-i)))
    11     {
    12         for (j=y;j<=k;j+=(j&(-j)))
    13         c[i][j]=max(c[i][j],v);
    14     }
    15 }
    16 int query(int x,int y)
    17 {int i,j;
    18     int s=0;
    19     for (i=x;i;i-=(i&(-i)))
    20     {
    21         for (j=y;j;j-=(j&(-j)))
    22         s=max(c[i][j],s);
    23     }
    24     return s;
    25 }
    26 int main()
    27 {int i,j;
    28     cin>>n>>k;
    29     k++;
    30     for (i=1;i<=n;i++)
    31     scanf("%d",&a[i]),sz=max(sz,a[i]);
    32     sz+=k;
    33     for (i=1;i<=n;i++)
    34     {
    35         for (j=k;j;j--)
    36         add(a[i]+j,j,query(a[i]+j,j)+1);
    37     }
    38     cout<<query(sz,k); 
    39 }
  • 相关阅读:
    linux_批量关闭进程
    latex_引用参考文献格式,引用多篇参考文献
    vue跨域解决方法
    vue点击返回顶部插件vue-totop
    百度分享vue版-vshare
    vue项目引入社交分享插件
    vshare
    vue分享插件
    EFCore使用SQL语句
    JDBC Request :Cannot load JDBC driver class 'com.mysql.jdbc.Driver'解决办法
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8726823.html
Copyright © 2011-2022 走看看