[题解]P3147 [USACO16OPEN] 262144 P
P3146 [USACO16OPEN] 248 G(弱化版)
我们先考虑区间dp,设\(f[i][j]\)表示\(a[i,j]\)恰好合并成\(1\)个元素后的答案,\(0\)表示无法合并。
那么对于\(k\)使得\(f[i][k]=f[k+1][j]\neq 0\),有转移\(f[i][j]=f[i][k]+1\)。
有结论:对于可以合并的区间\([l,r]\),它们能合并出的答案是唯一的。
\(\bf{Proof}\):可以将每个值\(a[i]\)映射到\(b[i]=2^{a[i]}\),合并相当于同指数相加,所以\(b\)的最终合并答案固定为\(2^x\),那么\(a\)的答案固定为\(x\)。
根据此结论,只要找到一个\(k\)满足条件,直接更新并break出去就可以,不需要对所有\(k\)取\(\max\)。
时间复杂度\(O(n^3)\),可以通过弱化版。
点击查看代码
#include<bits/stdc++.h>
#define N 250
using namespace std;
int n,a[N],f[N][N],ans;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],f[i][i]=a[i];
for(int len=1;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
for(int k=i;k<j;k++){
if(f[i][k]==f[k+1][j]&&f[i][k]){
f[i][j]=f[i][k]+1;
break;
}
}
ans=max(ans,f[i][j]);
}
}
cout<<ans<<"\n";
return 0;
}
根据上面的结论,可以推得:对于一个左端点\(l\),如果存在右端点\(r\),使得\(a[l,r]\)可以合并成整数\(k\),那么这个右端点\(r\)是唯一的。又受上面用二进制思考的证明的启发,我们采用倍增。
设\(f[i][j]\)表示以\(i\)为左端点合并成\(j\)这个答案的右端点\(+1\)是多少,\(0\)表示不存在右端点。
有转移\(f[i][j]=f[f[i][j-1]][j-1]\),很纯的倍增。
代码中循环跑到了\(58\),是因为答案最大就是\(58\),因为\(262144=2^{18}\),最极端的情况就是所有元素都是\(40\),此时答案是\(40+18=58\)。所以时间复杂度是\(O(n(\log n+V))\)的。
点击查看代码
#include<bits/stdc++.h>
#define N 262150
#define V 60
using namespace std;
int n,a[N],f[N][V],ans;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],f[i][a[i]]=i+1;
for(int i=2;i<=58;i++){
for(int j=1;j<=n;j++){
if(!f[j][i]) f[j][i]=f[f[j][i-1]][i-1];
if(f[j][i]) ans=i;
}
}
cout<<ans<<"\n";
return 0;
}
[题解]P3147 [USACO16OPEN] 262144 P的更多相关文章
- P3147 [USACO16OPEN]262144
P3147 [USACO16OPEN]262144一道非常有趣的游戏,不,题目.当数据水时,可以这样表示状态.f[i][j]表示合并[i,j]区间所能得到的最大值,有点floyed的小味道.if(f[ ...
- 洛谷P3147 [USACO16OPEN]262144
P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...
- 洛谷 P3147 [USACO16OPEN]262144
P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...
- P3146 [USACO16OPEN]248 & P3147 [USACO16OPEN]262144
注:两道题目题意是一样的,但是数据范围不同,一个为弱化版,另一个为强化版. P3146传送门(弱化版) 思路: 区间动规,设 f [ i ][ j ] 表示在区间 i ~ j 中获得的最大值,与普通区 ...
- 一道另类的区间dp题 -- P3147 [USACO16OPEN]262144
https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状 ...
- 洛谷 P3147 [USACO16OPEN]262144 P
链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并 ...
- luogu P3147 [USACO16OPEN]262144
题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...
- P3147 [USACO16OPEN]262144 (贪心)
题目描述 给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-262,144),问最大能合出多少.注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3. 这道题的思路: ...
- [USACO16OPEN]262144
传送门啦 其实大家可以先看一下这个题 [USACO16OPEN]248 分析: 数据范围很奇特:n特别,a[i]特别——如果O(N^3)能接受就直接区间DP水过了,但是不行,于是考虑设计一个状态囊括a ...
- 【[USACO16OPEN]262144】
发现这个数列的范围特别大但是值域的范围特别小 于是可以大胆猜测这道题值域肯定需要开到状态里去 又发现\(262144=2^{18}\)这个暗示非常明显啊,暗示这道题跟二进制有关系 其实也没什么关系 设 ...
随机推荐
- 洛谷 P5512 [NOIP1997 提高组] 棋盘问题 加强版
洛谷 P5512 [NOIP1997 提高组] 棋盘问题 加强版 Problem&Background 可以参考这个 Solution 首先先完成这道题的普通版本P1549 A了那一道题之后, ...
- Hyperledger Fabric2.x基本概念之(一)交易和区块链
▲ 点击101链视界,关注不走丢 大家好,我是阿创,这是我的第30篇原创文章. 我比较爱看书,2021年全年我的阅读量大概是20+本书,涵盖法律.哲学.技术.人文. 但是阅读量一上来反而会觉得,单纯的 ...
- 按下 F12 打开开发者工具,它凭什么能监控所有网络请求?
兄弟们,咱们天天跟浏览器打交道,F12 可能比键盘上其他任何一个功能键按得都多.我们习惯了在 Network 面板里看着请求瀑布流,调试 API,分析性能. 但你有没有停下来,哪怕一次,问过自己一个问 ...
- 防抖ref如何在vue中被定义
本文由 ChatMoney团队出品 为什么ref要实现防抖 在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这 ...
- Spring Cloud Gateway实现分布式限流和熔断降级
小伙伴们,你们好呀!我是老寇!一起学习学习gateway限流和熔断降级 一.限流 思考:为啥需要限流? 在一个流量特别大的业务场景中,如果不进行限流,会造成系统宕机,当大批量的请求到达后端服务时,会造 ...
- F-47(copy 邓大顾)
*&---------------------------------------------------------------------* *& F-47过账 *&--- ...
- [书籍精读]《你不知道的JavaScript(下卷)》精读笔记分享
写在前面 书籍介绍:JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解.本套书直面当前JavaSc ...
- 使用 Git 时出现 unable to access,如何解决?
回答重点 这个问题通常是由于网络访问问题.Git 配置错误或代理设置问题引起的.常见的解决方案: 1)检查网络连接:确保可以访问外部网络,尤其是 Git 仓库所在的服务器. 2)检查 Git 配置:使 ...
- 论文中关于要使用600线的python代码
简介 论文中通常要使用600dpi的图片, 如果一个一个用PS来进行修改实在是费力不讨好. 使用python一套带走 code import os from PIL import Image impo ...
- java combobox 多选框
简介 简单 code package calcu; import java.awt.*; import javax.swing.*; public class ComboBoxFrame extend ...