Hetao P1031 萌萌题 题解 [ 蓝 ] [ 线性 dp ]
萌萌题:一道结合了观察性质的线性 dp。

观察
我们先考虑极端情况:所有数相同,所有数降序排列两种情况。
对于所有数相同的情况,我们发现,最终可以合并出来的区间,最多只有 \(n \log n\) 个。
怎么证明?考虑固定右端点,那么我们想要合并出一个点,就得选 \(2^k\) 个数出来,这就有 \(\log n\) 次选择方式。总的来说就是有 \(n \log n\) 种选数方式了。
所有数降序排列是多少?我们只需要将最后两个元素合并,然后继续往前面合并即可。总体来说有 \(n\) 个。
dp 设计
这题还有个很重要的观察:对于固定了右端点的时候,假设我们要让这个数增加 \(v\),那么合并的方案(区间)一定是唯一的。这就启发了我们可以设计一个 dp,定义 \(dp_{i,j}\) 表示让元素 \(i\) 增加 \(j\) 后,合并到的区间的左端点的前一个数是哪里。
为什么要前一个数?其实你不要这前一个数其实也可以做。只不过我这样设计来讲比较好写转移的代码。
接下来就是很显然的转移,假设目前合并到的区间的左端点的前一个数为 \(now\),要增加 \(v\):
\]
然后记录一下合法状态就好了。
这样写对吗?实际上假了。这是我赛时的做法,当时误以为一个数最多增量只可能是 \(\log n\)。实际上降序排列就能把增量卡到 \(n\)。
那么开大小为 \(n\) 的增量可不可以?直接开肯定不行,会 MLE,但是动态开不就行了?根据前面的观察,我们最多只有 \(n \log n\) 个合法区间,那么每个数的增量也最多只有 \(n \log n\) 个,我们用 vector 模拟动态开 dp 数组的过程,这道题就 AC 了。
注意,当某个区间无法继续合并下去的时候,要立刻 break,才能保证复杂度正确,否则会退化为平方级别。
时间复杂度为 \(O(n\log n)\)。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,a[100005],ans=0;
vector<int>dp[100005];
int main()
{
freopen("cute.in","r",stdin);
freopen("cute.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
dp[i].emplace_back(i-1);
for(int j=1;j<=100000;j++)
{
int now=dp[i][j-1];
int ta=a[now];
int dt=a[i]+j-1-ta;
if(dt>=0&&dt<dp[now].size())dp[i].emplace_back(dp[now][dt]);
else break;
}
}
for(int i=1;i<=n;i++)ans=max(ans,a[i]+int(dp[i].size())-1);
cout<<ans<<endl;
return 0;
}
Hetao P1031 萌萌题 题解 [ 蓝 ] [ 线性 dp ]的更多相关文章
- 【AHOI2009】中国象棋 题解(线性DP+数学)
前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...
- 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)
ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...
- 单调队列+线性dp题Watching Fireworks is Fun (CF372C)
一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...
- cf909C 线性dp+滚动数组好题!
一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...
- [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题
题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 线性dp
线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
随机推荐
- Blazor 组件库 BootstrapBlazor 中Tag组件介绍
Tag组件的样子 Tag组件的介绍 Tag组件是一个非常简单的组件. <Tag Icon="fa fa-fw fa-check-circle" Color="Col ...
- vue3 中屏蔽控制台中的警告信息
main.js中 const app = Vue.createApp({}); // 屏蔽错误信息 app.config.errorHandler = () => null; // 屏蔽警告信息 ...
- Mysql8.0修改配置参数lower_case_table_names
现象 今天在配置一个环境的数据库,所使用的系统要求该数据库 lower_case_table_names = 1 (对数据库表明.列名大小写不敏感) 我看了一下,在 Windows 上,默认值为 1. ...
- tableau连接不上mysql或不显示mysql表的终极解决方法
[报错一]连不上mysql An error occurred while communicating with MySQL The connection to the data source mig ...
- GitHub主页3D图表显示
效果如图,项目来源于 yoshi389111/github-profile-3d-contrib: This GitHub Action creates a GitHub contribution c ...
- postgres
10.67 su - app docker pull postgres:12.15 docker run -d --name pgsql12 -p 5432:5432 -e "POSTG ...
- 从 ftp 上下载文件、文件夹
下载子文件夹: wget -r -nH --cut-dir=1 ftp://ip/folder_name/ 下载压缩文件: wget ftp://ip/folder_name/folder_name/ ...
- 会话丢失-NGINX配置之underscores_in_headers
1.描述问题NGINX代理某个web服务时,单机情况下也出现不停的要求认证的情况 初步分析去掉NGINX代理,直接访问服务,未出现上述情况: 进一步分析:查看经过NGINX的请求和直接访问服务请求区别 ...
- 转载 OKHttp使用详解
一,OKHttp介绍 okhttp是一个第三方类库,用于android中请求网络. 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和Le ...
- Qt/C++音视频开发80-ffmpeg实现srt推拉流/实时性非常好/音视频同步/支持格式众多
一.前言 目前互联网上的视频直播有两种,一种是基于RTMP协议的直播,这种直播方式上行推流使用RTMP协议,下行播放使用RTMP,HTTP+FLV或者HLS,直播延时一般大于3秒,广泛应用秀场.游戏. ...