目录

P3287-[SCOI2014]方伯伯的玉米田

P3287-[SCOI2014]方伯伯的玉米田

题目:

题目描述:

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

输入格式:

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

输出格式:

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

样例:

样例输入 1:

1
2
3 1
2 1 3

样例输出 1:

1
3

思路:

实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "ybwhead/ios.h"
int n, k;
const int maxn = 5e3 + 510;
const int maxm = 5e2 + 10;
int c[maxm][maxn], d[maxn][maxm];
#define lowbit(x) x & -x
int q(int c[], int pos)
{
    int ans = 0;
    for (; pos; pos -= lowbit(pos))
        ans = max(ans, c[pos]);
    return ans;
}
void add(int c[], int pos, int v, int tt)
{
    int ans = 0;
    for (; pos <= tt; pos += lowbit(pos))
        c[pos] = max(c[pos], v);
}
int main()
{
    yin >> n >> k;
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        int x;
        yin >> x;
        for (int j = 0; j <= k; j++)
        {
            int y = max(q(c[j + 1], x + j), q(d[x + j], j + 1)) + 1;
            ans = max(ans, y);
            add(c[j + 1], x + j, y, maxn - 2);
            add(d[x + j], j + 1, y, maxm - 2);
        }
    }
    yout << ans << endl;
}