P3287-[SCOI2014]方伯伯的玉米田
题目:
题目描述:
方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有 N 株,它们的高度参差不齐。方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。方伯伯可以选择一个区间,把这个区间的玉米全部拔高 1 单位高度,他可以进行最多 K 次这样的操作。拔玉米则可以随意选择一个集合的玉米拔掉。问能最多剩多少株玉米,来构成一排美丽的玉米。
输入格式:
第 1 行包含 2 个整数 n,K,分别表示这排玉米的数目以及最多可进行多少次操作。第 2 行包含 n 个整数,第 i 个数表示这排玉米,从左到右第 i 株玉米的高度 ai。
输出格式:
输出 1 个整数,最多剩下的玉米数。
样例:
样例输入 1:
样例输出 1:
思路:
实现:
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;
}
|