• [Scoi2014]方伯伯的玉米田


    [Scoi2014]方伯伯的玉米田

    Time Limit: 60 Sec  Memory Limit: 128 MB
    http://www.lydsy.com/JudgeOnline/problem.php?id=3594

    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

    dp[i][j]表示第i个拔了j次,以第i个为结尾的最长不下降子序列长度

    转移方程:dp[i][j]=max(dp[a][b])+1  a<i,b<=j, j+h[i]>=b+h[a]

    状态n*k,转移n*k  TLE

    用二维树状数组,可将转移优化至logk*loga

    树状数组的c[i][j]表示    拔了0——i次,高度为1——j的最长上升子序列长度

    树状数组不能使用0节点,所以i整体后移一位 

    c[i][j]表示  拔了i-1次

    注意枚举j的时候要倒叙

    原理类似01背包

    #include<cstdio>
    #include<algorithm>
    #define N 10001
    #define M 5600
    using namespace std;
    int h[N],c[510][M];
    int m,k;
    int lowbit(int i)
    {
        return i&(-i);
    }
    void change(int a,int b,int w)
    {
        for(int i=a;i<=k+1;i+=lowbit(i)) 
         for(int j=b;j<=m;j+=lowbit(j))
          c[i][j]=max(c[i][j],w);
    }
    int query(int a,int b)
    {
        int ans=0;
        for(int i=a;i;i-=lowbit(i)) 
         for(int j=b;j;j-=lowbit(j))
           ans=max(ans,c[i][j]);
           return ans;
    }
    int main()
    {
        int n,maxn=0,ans=0;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) 
        {
            scanf("%d",&h[i]);
            maxn=max(maxn,h[i]);
        }
        m=maxn+k;
        int tmp;
        for(int i=1;i<=n;i++)
         for(int j=k;j>=0;j--)
         {
            tmp=query(j+1,j+h[i])+1;
            change(j+1,h[i]+j,tmp);
            ans=max(ans,tmp);    
         }
        printf("%d",ans);
    }

    无限WA 原因:

    树状数组的操作中,没有新定义变量i,j

    void change(int a,int b,int w)
    {
      for(;a<=k+1;a+=lowbit(a))
        for(;b<=m;b+=lowbit(b))
      c[a][b]=max(c[a][b],w);
    }

  • 相关阅读:
    【计算机网络】物理层
    【计算机网络】计算机网络体系结构
    【计算机组成原理】存储器
    【计算机组成原理】定点数运算
    【计算机组成原理】校验码
    【计算机组成原理】数据的表示和运算
    【计算机组成原理】计算机系统概述
    【计算机组成原理】输入输出系统(一)
    【计算机组成原理】总线
    【计算机组成原理】中央处理器-硬布线控制器 流水线
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6885352.html
Copyright © 2020-2023  润新知