传送门

Description

给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-40),问最大能合出多少。注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3。

Input

输入的第一行是一个数字n,代表地图大小。然后n行,i+1行代表第i个数的大小

Output

输出仅一行,为最大能合并出的大小

Hint

1<=n<=248,不保证所有的数字能被合成完

Sample Input


Sample Output


solution

典型的区间DP。首先考虑区间dp最普通状态定义:用f[i][j]表示区间[i,j]所能合成的最大答案,转移为f[i][j]=max{f[i][k]+1|当且仅当f[i][k]==f[k+1][j]}。输出f[1][n],这么做本题存在缺陷:在转移时,无法保证区间f[i][j]的最大值在所需要的左(右)端点处被取到。例如:观察线段

此时f[1][3]=5,f[4][6]=5,但是无法进行合并,因为[1,3]等于5的位置在左侧,与[4,6]并不直接相连。

考虑增加维度,当前转移为n^3,增加维度时间爆炸,否定

考虑限制状态,记f[i][j]为区间[i,j]恰好能够合成的最大值,每次转移维护ans。转移同上。可行

  对于区间[i,j]的最大值一定可以由其两个子区间的最优解转移得到。

  证明:手推可能hack的情况,发现显然。

Code

#include<cstdio>
#define maxn 250 inline void qr(int &x) {
char ch=getchar();int f=;
while(ch>''||ch<'') {
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
x*=f;
return;
} inline int max(int a,int b) {return a>b?a:b;}
inline int min(int a,int b) {return a<b?a:b;} inline void swap(int &a,int &b) {
int c=a;a=b;b=c;return;
} int n,num[maxn],frog[maxn][maxn],ans; int main() {
qr(n);
for(int i=;i<=n;++i) {
qr(num[i]);frog[i][i]=num[i];
}
for(int i=;i<n;++i) {
for(int j=;j<=n;++j) {
int r=j+i;if(r>n) break;
for(int k=j;k<r;++k) {
if(!(frog[j][k]^frog[k+][r])) frog[j][r]=max(frog[j][r],frog[j][k]+),ans=max(ans,frog[j][r]);
}
}
}
printf("%d\n",ans);
return ;
}

summary

  对于DP时发现状态不够严谨导致转移困难,可以考虑对状态加以限制。在每次转移时更新答案。

  另外据说这题有大常数O(n)算法。可惜我不会

End on 2018/6/3

【区间DP】【lgP3146】248的更多相关文章

  1. 又一道区间DP的题 -- P3146 [USACO16OPEN]248

    https://www.luogu.org/problemnew/show/P3146 一道区间dp的题,以区间长度为阶段; 但由于要处理相邻的问题,就变得有点麻烦; 最开始想了一个我知道有漏洞的方程 ...

  2. 【bzoj4580】[Usaco2016 Open]248 区间dp

    题目描述 Bessie likes downloading games to play on her cell phone, even though she does find the small t ...

  3. 「USACO16OPEN」「LuoguP3146」248(区间dp

    题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...

  4. 「区间DP」「洛谷PP3146 」[USACO16OPEN]248 G

    [USACO16OPEN]248 G 题目: 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...

  5. 一道另类的区间dp题 -- P3147 [USACO16OPEN]262144

    https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状 ...

  6. 「USACO16OPEN」「LuoguP3147」262144(区间dp

    P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...

  7. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  8. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  9. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

随机推荐

  1. Git 新建文件并提交

    1.创建一个readme.txt. cd /home/cyp/learngit touch readme.txt vim readme.txt 编写内容, wq 保存推出 2.提交步骤 2.1  gi ...

  2. 【机器学习】多项式回归sklearn实现

    [机器学习]多项式回归原理介绍 [机器学习]多项式回归python实现 [机器学习]多项式回归sklearn实现 使用sklearn框架实现多项式回归.使用框架更方便,可以少写很多代码. 使用一个简单 ...

  3. tendermint学习

    怎么把两个节点变成验证节点 1. 两个节点分别启动 2. 两个节点同时把自己的公钥信息添加到对方的创始快配置文件中,总而言之,创始块一样 3. unsafe_reset_priv_validator ...

  4. HDU 4300 Clairewd’s message (next函数的应用)

    题意:给你一个明文对密文的字母表,在给你一段截获信息,截获信息前半段是密文,后半段是明文,但不清楚它们的分界点在哪里,密文一定是完整的,明文可能是残缺的,求完整的信息串(即完整的密文+明文串). 题解 ...

  5. 软件测试基础-Homework1

    The error was in my graduate work which was about game development.I broadcast some messages to the ...

  6. Java语法基础课后作业

    1.动手动脑 运行它EnumTest.java,分析运行结果 s和t分别引用的是SMALL和LARGE,枚举类型不是原始数据类型,s和u的赋值方式不同,但结果一样,列出它的所有值:SMALL,MEDI ...

  7. Swift-函数的理解

    /* 函数(Function) 函数是为执行特定功能的自包含的代码块.函数需要给定一个特定标识符(名字),然后当需要的时候, 就调用此函数来执行功能. */ // 函数的定义与调用 // 定义函数时, ...

  8. TCP系列15—重传—5、Linux中RTO的计算

    之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法.在linux中维护了srtt.mdev.mdev_max.rttvar.rtt_seq几个状态变量用来计算 ...

  9. 原生js移动端可拖动进度条插件

    该插件最初的想法来自网上的一篇文章,直达链接:https://www.cnblogs.com/libin-1/p/6220056.html 笔者因为业务需要寻找到这个插件,然后拿来用之,发现各种不方便 ...

  10. [C/C++] 原码、反码、补码问题

    正确答案:D 解析: C语言中变量以补码形式存放在内存中,正数的补码与原码相同,负数求补码方式为(符号位不变,其余各位取反,最后末尾加1): 32位机器:int 32位,short 16位.  x = ...