题目链接

题目

题目描述

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][j]\ |=\ f[i-1][f[i-1][j]]
\]

当然如果 \(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的更多相关文章

  1. 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 ...

  2. NC25136 [USACO 2006 Ope B]Cows on a Leash

    NC25136 [USACO 2006 Ope B]Cows on a Leash 题目 题目描述 给定如图所示的若干个长条.你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其 ...

  3. USACO 2016 US Open Contest, Gold解题报告

    1.Splitting the Field http://usaco.org/index.php?page=viewproblem2&cpid=645 给二维坐标系中的n个点,求ans=用一个 ...

  4. USACO 2016 February Contest, Gold解题报告

    1.Circular Barn   http://www.usaco.org/index.php?page=viewproblem2&cpid=621 贪心 #include <cstd ...

  5. USACO 2016 January Contest, Gold解题报告

    1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...

  6. usaco 2016 Feb 负载平衡

    题目大意:平面上一堆点,用两条平行于坐标轴的直线将其分为四部分,使得点数最多的一部分最少 第一维枚举,第二维三分,点集用两棵树状数组维护 #include<bits/stdc++.h> # ...

  7. [USACO 2016 Dec Gold] Tutorial

    Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...

  8. COGS130. [USACO Mar08] 游荡的奶牛[DP]

    130. [USACO Mar08] 游荡的奶牛 ★☆   输入文件:ctravel.in   输出文件:ctravel.out   简单对比时间限制:1 s   内存限制:128 MB 奶牛们在被划 ...

  9. COGS182 [USACO Jan07] 均衡队形[RMQ]

    182. [USACO Jan07] 均衡队形 ★★   输入文件:lineup.in   输出文件:lineup.out   简单对比时间限制:4 s   内存限制:128 MB 题目描述 农夫约翰 ...

  10. 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 ...

随机推荐

  1. Feign 实现微服务调用及进行服务熔断与降级

    本文为博主原创,未经允许不得转载: 1. Feign 日志级别配置 2. Feign client 封装调用 3. Feign 定义熔断降级方法 4. 通过 FallbackFactory 工厂 实现 ...

  2. Cortex-M3 MCU的技术特点

    1.Cortex-M3 MCU的技术特点 MCU简单来说就是一个可编程的中央处理器(CPU)加上一些必要的外设.不管是中央处理器还是整个MCU都是复杂的时序数字电路,根据程序或者指令来完成特定的任务. ...

  3. DASCTF X CBCTF 2023|无畏者先行 CRYPTO—WP

    EzRSA 1.题目信息 from Crypto.Util.number import * import random from gmpy2 import * from libnum import * ...

  4. Laravel - Eloquent 删除数据

        public function ormDelete()     {         # 1.通过模型删除         // $student = Student::where('id',5 ...

  5. [转帖]容器环境的JVM内存设置最佳实践

    https://cloud.tencent.com/developer/article/1585288 Docker和K8S的兴起,很多服务已经运行在容器环境,对于java程序,JVM设置是一个重要的 ...

  6. [转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复

    https://tidb.net/blog/4b5451bb?utm_source=tidb-community&utm_medium=referral&utm_campaign=re ...

  7. [转帖]PostgreSQL中的schema和user

    https://www.cnblogs.com/abclife/p/13905336.html postgresql中,用户创建的所有对象都被创建在指定的schema(或namespace)中.其他用 ...

  8. [转帖]文件操作之zip、bzip2、gzip、tar命令

    文件操作之zip.bzip2.gzip.tar命令 原创 丁同学19902015-10-15 00:02:51博主文章分类:liunx基础著作权 文章标签linux tarlinux文件压缩linux ...

  9. [转帖]kafka漏洞升级记录,基于SASL JAAS 配置和 SASL 协议,涉及版本3.4以下

    攻击者可以使用基于 SASL JAAS 配置和 SASL 协议的任意 Kafka 客户端,在对 Kafka Connect worker 创建或修改连接器时,通过构造特殊的配置,进行 JNDI 注入. ...

  10. [转帖]Linux—解压缩命令总结(tar/zip)

    https://www.jianshu.com/p/1ad5d852d13b 1 tar 1.2 tar介绍   tar命令是linux系统中对文件和目录解压缩命令.tar命令可以用于对后缀名为.ta ...