P3147 [USACO16OPEN]262144 (贪心)】的更多相关文章

题目描述 给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-262,144),问最大能合出多少.注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3. 这道题的思路: 这是上一道题的数据强化版,数据达到了 260000. 所以只能 O(nlogn) 的时间复杂度过. 然后就发现根本就已经不是一道题目了,方程和处理方式完全不一样.    非动规版本 非动规版本是动用了一个数据结构---栈. 比较巧妙. 因为这道题有带一点贪心的思想在里面,因为所有的元素就只有那些,所…
P3147 [USACO16OPEN]262144一道非常有趣的游戏,不,题目.当数据水时,可以这样表示状态.f[i][j]表示合并[i,j]区间所能得到的最大值,有点floyed的小味道.if(f[i][k]==f[k+1][j])f[i][j]=max(f[i][k]+1,f[i][j]);不断更新答案.这样需要枚举左右端点和中间点,O(n^3)300以内的数据可以水过.状态的设定直接把dp拉到暴力里去了. #include<iostream> #include<cstdio>…
P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.…
P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.…
注:两道题目题意是一样的,但是数据范围不同,一个为弱化版,另一个为强化版. P3146传送门(弱化版) 思路: 区间动规,设 f [ i ][ j ] 表示在区间 i ~ j 中获得的最大值,与普通区间动规最大的不同在于:只有左区间的最大值等于右区间的最大值时才能够进行转移. AC代码: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<cst…
https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状态表示法根本存不下, 这时我们就要想另外的状态表示法; #include <bits/stdc++.h> #define read read() #define up(i,l,r) for(int i = (l);i <=(r); i++) using namespace std; int…
链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并且n的范围也不支持. 于是想贪心,但是贪着贪着发现自己想不出,于是看题解,发现唯一的贪心也被hack了,果然正解不是贪心. 决定放弃. 于是回头重新看题分析,首先根据n的范围分析后可以发现答案范围很小,最大为58,又回到刚开始的区间DP,我们发现其中有三个关键值,左端点,右端点和答案,那么我们可以尝…
题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind 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 seq…
传送门啦 其实大家可以先看一下这个题 [USACO16OPEN]248 分析: 数据范围很奇特:n特别,a[i]特别——如果O(N^3)能接受就直接区间DP水过了,但是不行,于是考虑设计一个状态囊括a[i]. 注意到a[i]每次合并只+1,于是想到答案其实就是最大的被合并的数+1,并且可以按a[i]从小到大的顺序DP. 状态:f[i][j]表示从第j个数向右合并成数字i的下标的下一位. 状态转移方程:f[i][j] = f[i-1][f[i-1][j]] #include <iostream>…
发现这个数列的范围特别大但是值域的范围特别小 于是可以大胆猜测这道题值域肯定需要开到状态里去 又发现\(262144=2^{18}\)这个暗示非常明显啊,暗示这道题跟二进制有关系 其实也没什么关系 设\(dp[i][j]\)表示从\(i\)位置开始合并,合并出\(j\)这个数所合并的区间的尾位置在哪里 之后就会发现这个转移非常像倍增 \[dp[i][j+1]=dp[dp[i][j]+1][j]\] 就这样了,暴力合并就可以了 同时值域范围需要开到\(40+log_2{262148}=58\) 代…