[SCOI2014]方伯伯的玉米田
题目链接
算法:
为了保证DP的正确与方便,这里先提供一个结论:每次操作都一定要拔高第n棵玉米。
以下引用NS·YJD大佬的一篇博客的证明:
首先无论操作区间在哪里,如果区间两边存在玉米,那么这些玉米与区间内玉米拔高后的相对高度关系只有3种情况:1.原本区间内比它们高的玉米还是比它们高。2.原本区间内比它们矮的玉米不再比它们矮。3.原本区间内比它们矮的玉米还是比它们矮。
对于区间左边而言:
这三种情况都不会减少初始排列中已存在的最长不下降序列的长度,并且有可能使它增长
对于区间右边而言:
这三种情况都不会增加初始排列中已存在的最长不下降序列的长度,并且有可能使它减少
如此一来我们就可以发现,要想得到最长不下降序列,区间的右边不存在玉米的情况一定是最优解。
由此,我们可以设为以第i个玉米高度为结尾,且第i个玉米拔高j次的最长上升子序列的长度。
所以状态转移方程即为,(此时“,"表示“且”)
转移我们则可以用二维树状数组维护前缀最大值(相当于我们将的值转化为的值,然后求中的最大值)。
注意:由于j的值可以为0,在作为树状数组的下标中,我们修改与查询就可以把第二位坐标+1。
所求答案一目了然吧。。。。。
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rep2(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
template<typename T> void read(T &num){char c=getchar();num=0;T f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}num*=f;
}
template<typename T> void qwq(T x){if(x>9)qwq(x/10);putchar(x%10+'0');
}
template<typename T> void write(T x){if(x<0){x=-x;putchar('-');}qwq(x);putchar('\n');
}
template<typename T> void chkmax(T &x,T y){x=x>y?x:y;}int n,k,sx;
int co[10010];int tree[6010][510];
inline int lowbit(int x){return x&(-x);}
inline void change(int x,int y,int w){while(x<=sx+k){int pos=y;while(pos<=k+1){chkmax(tree[x][pos],w);pos+=lowbit(pos);}x+=lowbit(x);}return;
}
inline int query(int x,int y){int ans=0;while(x){int pos=y;while(pos){chkmax(ans,tree[x][pos]);pos-=lowbit(pos);}x-=lowbit(x);}return ans;
}int main(){read(n);read(k);sx=0;rep(i,1,n){read(co[i]);chkmax(sx,co[i]);}rep(i,1,n){rep2(j,k,0){change(co[i]+j,j+1,query(co[i]+j,j+1)+1);}}write(query(sx+k,k+1));return 0;
}
[SCOI2014]方伯伯的玉米田相关推荐
- bzoj 3594: [Scoi2014]方伯伯的玉米田
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1399 Solved: 627 [Submit][ ...
- [bzoj 3594] [Scoi2014]方伯伯的玉米田
[bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...
- [SCOI2014]方伯伯的玉米田 //二维树状数组优化DP
题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...
- bzoj3594 [Scoi2014]方伯伯的玉米田
题目链接 二维树状数组优化DP DP状态很容易想到:dp[i][j]表示到第i颗玉米,用了j次提升,最多保留多少: 转移: dp[i][j]=dp[k][j]+1(k<=i&&a ...
- bzoj3594[Scoi2014]方伯伯的玉米田
http://www.lydsy.com/JudgeOnline/problem.php?id=3594 题目就是问你至多操作K次后的最长上升子序列. 首先,我们会得到一个结论:每次操作区间的右端点一 ...
- 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)
传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...
- SCOI2014 方伯伯的玉米田 题解
可能其它还没写完的几篇随笔要搁一会儿,反正先写写题解 \(1-n\)的一个序列,值分别为\(a[1]\).\(a[2]...a[n]\),最多可进行\(K\)次操作,每次操作可以使\(l-r\)区间内 ...
- P3287 [SCOI2014]方伯伯的玉米田
原题链接 数据结构优化DP 前置知识:二维树状数组 e.g.https://www.luogu.com.cn/problem/P4514 思路如下: 代码如下: #include <cstdio ...
- 【BZOJ3594】方伯伯的玉米田(SCOI2014)-DP+二维树状数组
测试地址:方伯伯的玉米田 做法:本题需要用到DP+二维树状数组. 首先,我们发现每次拔高的区间都是一个后缀.这个自己画一画就大概能证出来了. 那么我们就有了一个状态定义:令 f(i,j) f ( i ...
最新文章
- window 10 系统 部分软件打开图标的修改
- 链表问题2——在单链表中删除倒数第K个节点
- 一文快速入门分库分表中间件 Sharding-JDBC
- Cassandra key说明——Cassandra 整体数据可以理解成一个巨大的嵌套的Map MapRowKey, SortedMapColumnKey, ColumnValue...
- 树莓派该文件名_树莓派学习笔记(2):常用linux命令
- Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
- Service startService方式的服务
- 模型集成01-Bagging/Boosting/Stacking
- Elasticsearch 高并发写入优化的开源协同经历 | 技术头条
- 滴滴否认上海团队解散;雄安超前布局 5G;小米拆分独立品牌 | 极客头条
- 45. Use member function templates to accept all compatible types.
- CLion安装 + MinGW 配置 + Opencv安装
- 计算机组装维修中级试题,维修电工中级培训考试题及答案
- ICPC冠军教练亲自授课 字节跳动ICPC冬令营全球招募50支受训队
- JavaSE实战项目:飞翔的小鸟(完整版)
- java 模板 word转pdf 可分页 带图片
- Redmi K20 Pro 编译 PixelExperience
- OPA277/OPA2277/OPA4277 High Precision Operational Amplifiers 高精度运放
- 面向对象的讨论-2022年5月4日
- 使用J-Link打印日志
热门文章
- 十七 SQL ALTER 与 AUTO INCREMENT
- matlab求点,MATLAB求两点中点
- linux 文件md5,Linux下计算文件的MD5值
- 叠片过滤器:叠片过滤器使用注意事项
- bind9 dlz mysql_源码安装Bind 9.10 正式版 开启DLZ数据库支持 和 数据库view查询
- 小谢同学的C语言之路————第一章 初遇C语言 第二集 数据类型
- 通信工程/电子信息工程 保研夏令营/预推免流程分析
- 2023年全国最新二级建造师精选真题及答案2
- 微信小程序开通直播的条件
- 老版java奇缘幻境,老版奇缘幻境1