原题链接
数据结构优化DP

前置知识:二维树状数组 e.g.https://www.luogu.com.cn/problem/P4514
思路如下:
代码如下:

#include <cstdio>
#include <cctype>using namespace std; inline int read() {int x = 0, f = 0; char ch = getchar(); while (!isdigit(ch)) f = ch == '-', ch = getchar(); while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar(); return f ? -x : x;
}inline void print(int x) {if (x < 0) putchar('-'), x = -x;if (x < 10) putchar(x  + '0');else {print(x / 10); putchar(x % 10 + '0');}
}const int N = 2050;
int n, m;
int tr[4][N][N]; void addtr(int type, int x, int y, int k) {for (int i = x; i < N; i += (i & -i)) {for (int j = y; j < N; j += (j & -j)) {tr[type][i][j] += k; }}
}int asktr(int type, int x, int y) {int res = 0; for (int i = x; i > 0; i -= (i & -i)) {for (int j = y; j > 0; j -= (j & -j)) {res += tr[type][i][j]; }}return res;
}void add(int x, int y, int k) {addtr(0, x, y, k); addtr(1, x, y, k * y); addtr(2, x, y, k * x); addtr(3, x, y, k * x * y);
}int ask(int x, int y) {return asktr(0, x, y) * (x * y + y + x + 1) - asktr(1, x, y) * (x + 1) - asktr(2, x, y) * (y + 1) + asktr(3, x, y);
}int main() {scanf("X %d %d", &n, &m); char opt; int aa, bb, cc, dd, kk; while (~scanf("%s",&opt)) {scanf("%d%d%d%d", &aa, &bb, &cc, &dd);if (opt == 'L') {scanf("%d", &kk); add(aa, bb, kk); add(aa, dd + 1, -kk); add(cc + 1, bb, -kk); add(cc + 1, dd + 1, kk); } else {print(ask(cc, dd) - ask(aa - 1, dd) - ask(cc, bb - 1) + ask(aa - 1, bb - 1)); putchar('\n'); }}return 0;
}

回到本题,
f[i,j]表示以i为结尾,i位置提升j次的最长单调不下降序列,则有:
f[i,j] = max{f[k,l]} + 1, 1 <= k < i, 0 <= l <= j, h[i] + j >= h[k] + l,
考虑滚动数组省去一维,可有h[i] + j >= h[k] + l的限制,则针对该限制再加一维,
f[j, k]表示以i为结尾,提升后高度为j, i位置提升k次的最长单调不下降序列,则有:
j = h[i] + k, f[j,k] = max{f[l,m]} + 1, 1 <= l <= j, 0 <= m <= k,
考虑二维树状数组优化,由于第二维可取0,则整体加1,
代码如下:

#include <cstdio>
#include <cctype>
#include <algorithm>using namespace std; inline int read() {int x = 0, f = 0; char ch = getchar(); while (!isdigit(ch)) f = ch == '-', ch = getchar(); while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar(); return f ? -x : x;
}inline void print(int x) {if (x < 0) putchar('-'), x = -x;if (x < 10) putchar(x  + '0');else {print(x / 10); putchar(x % 10 + '0');}
}const int N = 10010, L = 5010, K = 510;
int n, k, ans, a[N], tr[L + K][K]; void update(int x, int y, int kk) {for (int i = x; i < L + K; i += i & -i) {for (int j = y; j < K; j += j & -j) {tr[i][j] = max(tr[i][j], kk); }}
}int find(int x, int y) {int res = 0; for (int i = x; i > 0; i -= i & -i) {for (int j = y; j > 0; j -= j & -j) {res = max(res, tr[i][j]); }}return res;
}int main() {n = read(); k = read(); for (int i = 1; i <= n; ++i) {a[i] = read(); } for (int i = 1; i <= n; ++i) {for (int j = k; j >= 0; --j) {int x = find(a[i] + j, j + 1) + 1; ans = max(ans, x); update(a[i] + j, j + 1, x); }}print(ans); return 0;
}

P3287 [SCOI2014]方伯伯的玉米田相关推荐

  1. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  2. [bzoj 3594] [Scoi2014]方伯伯的玉米田

    [bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...

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

    题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...

  4. bzoj3594 [Scoi2014]方伯伯的玉米田

    题目链接 二维树状数组优化DP DP状态很容易想到:dp[i][j]表示到第i颗玉米,用了j次提升,最多保留多少: 转移: dp[i][j]=dp[k][j]+1(k<=i&&a ...

  5. [SCOI2014]方伯伯的玉米田

    题目链接 算法: 为了保证DP的正确与方便,这里先提供一个结论:每次操作都一定要拔高第n棵玉米. 以下引用NS·YJD大佬的一篇博客的证明: 首先无论操作区间在哪里,如果区间两边存在玉米,那么这些玉米 ...

  6. bzoj3594[Scoi2014]方伯伯的玉米田

    http://www.lydsy.com/JudgeOnline/problem.php?id=3594 题目就是问你至多操作K次后的最长上升子序列. 首先,我们会得到一个结论:每次操作区间的右端点一 ...

  7. 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)

    传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...

  8. SCOI2014 方伯伯的玉米田 题解

    可能其它还没写完的几篇随笔要搁一会儿,反正先写写题解 \(1-n\)的一个序列,值分别为\(a[1]\).\(a[2]...a[n]\),最多可进行\(K\)次操作,每次操作可以使\(l-r\)区间内 ...

  9. 【BZOJ3594】方伯伯的玉米田(SCOI2014)-DP+二维树状数组

    测试地址:方伯伯的玉米田 做法:本题需要用到DP+二维树状数组. 首先,我们发现每次拔高的区间都是一个后缀.这个自己画一画就大概能证出来了. 那么我们就有了一个状态定义:令 f(i,j) f ( i ...

最新文章

  1. 学术-数学:哥德巴赫猜想
  2. 深度学习的“瓶颈”与“遛狗”定理
  3. mysql数据库回滚日志_Mysql数据库应急响应中日志排查
  4. Mycat环境搭建教程收集(待实践)
  5. oracle dbms_sql.describe_columns,PL/SQL Challenge 每日一题:2017-3-6 DBMS_SQL.DESCRIBE_COLUMNS
  6. 文本挖掘(part2)--分词
  7. 用 WebClient 轻松实现文件下载上传、网页抓取
  8. java lookandfeel nimbus_动态改变LookAndFeel
  9. 计算机应用基础操作题提示,计算机应用基础_操作题文字提示(已经放大了请不要打印).doc...
  10. QT5.10+MinGW+OpenCV3.4.2编译
  11. C++ 字节流与二进制字符串相互转换(一个简单的明文加解密程序)
  12. WordPress 在function.php 文件中方法中the_XXX方法失效
  13. Wireshark实战分析之DNS协议分析(一)
  14. 腾讯云IM购买和接入指南
  15. 函数-6已知输入为一个列表,列表中的元素都为整数,我们定义元素筛选函数为foo,功能是检查获取传入列表对象的所有奇数位索引(注意列表的索引是从0开始的)对应的元素,并将其作为新列表返回给调用者。
  16. QT软件开发: 基于QT设计的完整版视频播放器、多媒体播放器(mdk-sdk)
  17. @2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) K:Kayaking Trip(二分+贪心)
  18. 力扣刷题 DAY_71 回溯
  19. Git报错Kex_exchange_identification
  20. pytorch之深度神经网络概念全面整理

热门文章

  1. 360°全景图制作步骤和技巧有哪些?
  2. Java题目:寻找自幂数
  3. 记录清理服务器挖矿木马warmup的命令
  4. 为什么程序员要学linux?
  5. db2建立表空间 linux,DB2实验教程:创建数据库/表空间
  6. win快捷键_终于找到了!10个Win+组合快捷键,让你的工作效率提升10倍
  7. 根据ID从FASTA文件中批量提取序列【Python】
  8. CAD绘制二维码(网页版)
  9. RK920C键盘出现输入del键,会输出q信息,输入Ins键会输出1信息
  10. 针对win10激活出现的一系列问题解决方法