「SCOI2014」方伯伯的玉米田

动态规划+数据结构优化

每次操作区间的右端点一定为n,因为要尽量的让后面的数更大

记 f[i][k] 为以第i个玉米为结尾一共操作了k次的最长不下降序列的长度

因为每次操作右端点为n,左端点小于等于i

所以此时i的高度为 h[i] + k

则 f[i][k] = max(f[j][l]) + 1 // h[j] + l <= h[i] + k, j < i, l <= k

将每个状态 f[i][k] 可以表示为 (k, h[i] + k) // 操作次数,结尾高度

每次转移相当于取 (K, H) K <= k, H <= h[i] + k的最大值

可以用二维树状数组来维护

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int N = 1e4 + 5, K = 505, H = 6005;
 5
 6 int n, k, h[N], Max, f[N][K], tr[K][H], ans;
 7
 8 int query(int x, int y) {
 9     int i = x, res = 0;
10     while (i) {
11         int j = y;
12         while (j) {
13             res = max(res, tr[i][j]);
14             j -= (j & (-j));
15         }
16         i -= (i & (-i));
17     }
18     return res;
19 }
20
21 void update(int x, int y, int val) {
22     int i = x;
23     while (i <= k + 1) {
24         int j = y;
25         while (j <= Max) {
26             tr[i][j] = max(tr[i][j], val);
27             j += (j & (-j));
28         }
29         i += (i & (-i));
30     }
31     return;
32 }
33
34 int main() {
35     cin >> n >> k;
36     for (int i = 1; i <= n; i++) {
37         scanf("%d", &h[i]);
38         Max = max(Max, h[i] + k);
39     }
40     for (int i = 1; i <= n; i++)
41         for (int j = k; j >= 0; j--) {
42             f[i][j] = query(j + 1, h[i] + j) + 1;
43             ans = max(ans, f[i][j]);
44             update(j + 1, h[i] + j, f[i][j]);
45         }
46     cout << ans << endl;
47 }

原文地址:https://www.cnblogs.com/ympc2005/p/12318290.html

时间: 2024-11-12 19:44:17

「SCOI2014」方伯伯的玉米田的相关文章

「SCOI2014」方伯伯的商场之旅

「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石子的数量,刚好是 \(i\) 写成 \(K\) 进制后的第 \(j\) 位. 现在方伯伯要玩一个游戏,商场会给方伯伯两个整数 \(L,R\).方伯伯要把位置在 \([L, R]\) 中的每个人的石子都合并成一堆石子.每次操作,他可以选择一个人面前的两堆石子,将其中的一堆中的某些石子移动到另一堆,代价

【BZOJ3594】【SCOI2014】 方伯伯的玉米田

显然可以看出这是一道DP,然后就开始定义状态... f[i][j]表示已经处理完i根玉米,拔高了j次,剩下的玉米的最大值. f[i][j] = max{f[x][y]+1}(x<i,y<=j,h[x]+y<=h[i]+j). 于是就可以用二维树状数组维护最大值了,第一维维护拔高次数,第二维维护拔高后的高度. 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include

bzoj3594 [Scoi2014]方伯伯的玉米田

3594: [Scoi2014]方伯伯的玉米田Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1437 Solved: 647[Submit][Status][Discuss]Description方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把

bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Status] Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把这个区间的

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

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

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

题面: 3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1403  Solved: 630[Submit][Status][Discuss] Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可

[Scoi2014]方伯伯的玉米田

[Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.php?id=3594 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,

【BZOJ 3594】 [Scoi2014]方伯伯的玉米田

3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 633 Solved: 256 [Submit][Status][Discuss] Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列. 方伯伯可以选

[SCOI2014]方伯伯的玉米田 //二维树状数组优化DP//unfinished

闲的慌,从HZOJ里挑了道DP题来做,没想到这么恐怖 但是已经开了坑也不能退,干脆写吧 题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作.拔玉米则可以随意选择一个集合的玉米拔掉.问能最多剩多少株玉米,来构成一排美丽的玉米