NC24438 [USACO 2016 Ope P]262144
题目
题目描述
Bessie likes downloading games to play on her cell phone, even though she does find the small touch screen rather cumbersome to use with her large hooves.
She is particularly intrigued by the current game she is playing. The game starts with a sequence of N positive integers (2≤N≤262,144), each in the range 1…40. In one move, Bessie can take two adjacent numbers with equal values and replace them a single number of value one greater (e.g., she might replace two adjacent 7s with an 8). The goal is to maximize the value of the largest number present in the sequence at the end of the game. Please help Bessie score as highly as possible!
输入描述
The first line of input contains N, and the next N lines give the sequence of N numbers at the start of the game.
输出描述
Please output the largest integer Bessie can generate.
示例1
输入
4
1
1
1
2
输出
3
说明
In this example shown here, Bessie first merges the second and third 1s to obtain the sequence 1 2 2, and then she merges the 2s into a 3. Note that it is not optimal to join the first two 1s.
题解
知识点:区间dp,倍增。
显然是dp,但状态比较巧妙。
设 \(f[i][j]\) 表示以 \(j\) 为左端点合并出数字 \(i\) 的右端点位置,代表这个区间 \([j,f[i][j])\) 能合并出一个 \(i\) 。
这里的转移方程用了个倍增的思想,即跳跃两个点。 \(f[i-1][j]\) 表示从 \(j\) 开始合并出 \(i-1\) 的右端点位置。因为要两个 \(i-1\) ,所以若 \(f[i-1][j]\) 存在,则从 \(j\) 开始到 \(f[i-1][j]\) 能合并一个 \(i-1\) ,接下来若 \(f[i-1][f[i-1][j]]\) 存在,则从 \(f[i-1][j]\) 到 \(f[i-1][f[i-1][j]]\) 合并成第二个 \(i-1\) ,于是有转移方程:
\]
当然如果 \(f[i-1][j]\) 或者 \(f[i-1][f[i-1][j]]\) 为 \(0\) 即不存在,是不会改变 \(f[i][j]\) 的。同时不可能存在 \(f[i][j]\) 和 \(f[i-1][j]\) 同时存在的情况,不必担心或运算改变本来的值。
初始状态是 \(f[x][i] = i+1\) ,表示 \([i,i+1)\) 能合成一个 \(x\) 。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
using namespace std;
int f[60][262144 + 7];///表示数字i在j位置的下一个数字的位置(因为两个数字合并成一个,所以新数字的下一个要跳过一个数字)
///而且数字合并有很多可能,比如 1 1 1 2可以 2 1 2;1 2 2,因此对于这种记录方法可以使得数字的跳转独立,形成不同的链
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1, x;i <= n;i++) cin >> x, f[x][i] = i + 1;
int ans = 1;
for (int i = 2;i <= 58;i++) {
for (int j = 1;j <= n;j++) {
f[i][j] |= f[i - 1][f[i - 1][j]];
///数字向左合并,因为链是向右的
///表示如果数字i-1在j位置存在指向下一个位置的数字也存在,则这个数字指向下下个数字位置
///或运算好处是如果i,j本身存在则i-1,j不可能存在最终i-1,(i-1,j)也是不存在的不会改变i,j
///如果i,j不存在则为0,就会修改成结果
if (f[i][j]) ans = i;
}
}
cout << ans << '\n';
return 0;
}
NC24438 [USACO 2016 Ope P]262144的更多相关文章
- NC24017 [USACO 2016 Jan S]Angry Cows
NC24017 [USACO 2016 Jan S]Angry Cows 题目 题目描述 Bessie the cow has designed what she thinks will be the ...
- NC25136 [USACO 2006 Ope B]Cows on a Leash
NC25136 [USACO 2006 Ope B]Cows on a Leash 题目 题目描述 给定如图所示的若干个长条.你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其 ...
- USACO 2016 US Open Contest, Gold解题报告
1.Splitting the Field http://usaco.org/index.php?page=viewproblem2&cpid=645 给二维坐标系中的n个点,求ans=用一个 ...
- USACO 2016 February Contest, Gold解题报告
1.Circular Barn http://www.usaco.org/index.php?page=viewproblem2&cpid=621 贪心 #include <cstd ...
- USACO 2016 January Contest, Gold解题报告
1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...
- usaco 2016 Feb 负载平衡
题目大意:平面上一堆点,用两条平行于坐标轴的直线将其分为四部分,使得点数最多的一部分最少 第一维枚举,第二维三分,点集用两棵树状数组维护 #include<bits/stdc++.h> # ...
- [USACO 2016 Dec Gold] Tutorial
Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...
- COGS130. [USACO Mar08] 游荡的奶牛[DP]
130. [USACO Mar08] 游荡的奶牛 ★☆ 输入文件:ctravel.in 输出文件:ctravel.out 简单对比时间限制:1 s 内存限制:128 MB 奶牛们在被划 ...
- COGS182 [USACO Jan07] 均衡队形[RMQ]
182. [USACO Jan07] 均衡队形 ★★ 输入文件:lineup.in 输出文件:lineup.out 简单对比时间限制:4 s 内存限制:128 MB 题目描述 农夫约翰 ...
- 2016 Multi-University Training Contest 1 F.PowMod
PowMod Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
随机推荐
- Zookeeper 实现 ssl 双向认证
本文为博主原创,未经允许不得转载: zookeeper 作为注册中心或服务发现协调中心的时候,zookeeper 默认与其他服务通过 http 进行通信. zookeeper 与协调服务配置 ssl ...
- 基于AHB_BUS的eFlash控制器的微架构设计
eFlash微架构设计 1.回顾架构设计 2.Flash时序仿真 2.1 ahb_flashc项目目录 docs rtl sim tb model 2.2 docs 架构设计文档 微架构设计文档 集成 ...
- SpringMVC02——第一个MVC程序-注解版(high版!!!!)
注解版 新建一个子项目,添加Web支持 在pom.xml文件中引入相关的依赖:主要引入Spring框架核心库.SpringMVC.servlet,JSTL等. 创建实体类Fruit package c ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.22)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- 【秘籍揭秘】如何高速下载游戏、Switch资源?省时省力一网打尽!
百度云盘SVIP合租啦亲爱的考研党和游戏玩家们,我今天要分享的是一份独家秘籍!你是不是常常为下载游戏或Switch资源而烦恼?是不是经常遇到下载速度慢.限速等问题,让你等待无尽?别担心,我有一个绝密的 ...
- Oracle session的sid与serial的简单学习
Oracle session的sid与serial的简单学习 ITPUB vage的说法 这样说吧,Oracle允许的会话数(或者说连接数)是固定的,比如是3000个.假设每个会话要占1K字节,哪一共 ...
- [转帖]mysql - 使用文件中的 mysql 加载数据格式化 csv 日期列
https://www.coder.work/article/2481907#:~:text=LOAD%20DATA%20INFILE%20%27%2Finvoices%2Finvoice138130 ...
- 【转帖】Windows Server 2016与旧版本系统比较
一.性能和可扩性 特征描述 Windows Server 2012/2012 R2 标准版和数据中心 Windows Server 2016 标准版和数据中心 物理内存(主机)支持 每个物理服务器至多 ...
- [转帖]如何用python连接Linux服务器
1.安装paramiko库 pip install paramiko 2.使用paramiko库连接linux #导入库 import paramiko 创建一个sshclient对象 ssh = p ...
- DBeaver连接国产信创数据库的步骤
DBeaver连接国产信创数据库的步骤 本次连接使用的数据库类型 1.达梦 2.神通 3.人大金仓 4.瀚高 安装DBeaver 通过官网或者是其他网站下载最新的数据库介质 之后的操作为: 这次不感谢 ...