链接:

problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334

题意:一个长度为500的数列。每一个数可能是2,4,8。16。从第一个開始取,每一个数能够选择取或者不取。假设取了x。这个数和之前的数假设同样。那么两个数会合并成为2*x而且收起来,假设不同就把这个数收起来。

思路:比方像要凑成2048,必须拥有一个1024,512,256,128,64,32,16,8,4,2中某段从1024開始的连续递减序列,然后再取得一个和末尾数同样的数才干连续合并成为2048。

所以状态压缩仅仅须要记录递减序列的状态存在情况进行压缩就可以。DP[i][j]记录的是第i位置所取到的j情况递减序列,第1位是2。第2位是4,第3位8..(500个16的极限情况也仅仅有8000。所以最多仅仅须要12位,也就是最高位4096来记录。所以仅仅有4095种情况。由于不存在1和0的情况).用一个二进制数来表示这些位是否有取到。问题关键在于假设将第i位合并进去,必须保证该状态下第1~i-1位都是0。否则就不是连续递减序列。

P.S.比赛时候想这道题想的复杂了。比方2 2 2 这样的情况我觉得还要考虑是合并成2 4,还是合并成4 2两种状况。实际上不须要。由于没取一个数就进行自己主动合并,而不是要我决定是否合并。

代码:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define maxn 10005
#define PI acos(-1.0)
#define seed 31//131,1313
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int dp[505][4100];
int a[505],Pow[15];
map < int,int > M;
void init()
{
memset(dp,-1,sizeof(dp));
M[2]=1;
int pos=2;
for(int i=2; i<=12; i++)
{
pos*=2;
M[pos]=i;
}
return ;
}
int main()
{
int T,tot;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d",&tot);
for(int i=1; i<=tot; i++)
scanf("%d",&a[i]);
dp[1][a[1]>>1]=a[1];
for(int i=2; i<=tot; i++)
{
int dn=(a[i]>>1)-1;
dp[i-1][0]=0;
for(int j=0; j<4096; j++)
{
if(dp[i-1][j]>dp[i][j])
dp[i][j]=dp[i-1][j];
if((j&dn)==0&&dp[i-1][j]!=-1)
{
int ans=0;
int k=a[i]>>1;
while(1)
{
if((k&j)==0)
break;
k*=2;
ans+=k*2;
}
int next=j-(ans>>2)+k;
dp[i][next]=max(dp[i-1][j]+ans+a[i],dp[i][next]);
}
else if((j&dn)!=0&&dp[i-1][j]!=-1)
{
dp[i][dn+1]=max(dp[i][dn+1],dp[i-1][j]+a[i]);
}
}
}
int ans=0;
for(int i=0; i<4096; i++)
{
ans=max(ans,dp[tot][i]);
}
printf("%d\n",ans);
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

ZOJ 3802 Easy 2048 Again 像缩进DP的更多相关文章

  1. ZOJ 3802 Easy 2048 Again 状态DP

    zoj 上次的月赛题,相当牛的题目啊,根本想不到是状态压缩好吧 有个预先要知道的,即500个16相加那也是不会超过8192,即,合并最多合并到4096,只有2的12次方 所以用状态压缩表示前面有的序列 ...

  2. Easy 2048 Again - ZOJ 3802 像缩进dp

    Easy 2048 Again Time Limit: 2 Seconds      Memory Limit: 65536 KB Dark_sun knows that on a single-tr ...

  3. ZOJ3802 Easy 2048 Again (状压DP)

    ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  4. HDU 3681 BFS&amp;像缩进DP&amp;二分法

    N*M矩阵.从F出发点.走完全部Y点.每个人格开支1电源点,去G点,电池充满,D无法访问.最小的开始问什么时候满负荷可以去完全部Y.Y和G总共高达15一 第一BFS所有的F.Y.G之间的最短距离. 然 ...

  5. zoj3802:easy 2048 again(状压dp)

    zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...

  6. Easy 2048 Again(状压dp)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3802 题意: 从数列A中, 删除若干个数(可以0个), 是删除 ...

  7. ZOJ 3494 BCD Code(AC自动机+数位DP)

    BCD Code Time Limit: 5 Seconds      Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding ...

  8. ZOJ 2563 Long Dominoes(状态压缩DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1563 题目大意:在h*w的矩阵里铺满1*3的小矩阵,共有多少种方法 ...

  9. LA 3516(ZOJ 2641) Exploring Pyramids(递推 DP)

    Exploring Pyramids Archaeologists have discovered a new set of hidden caves in one of the Egyptian p ...

随机推荐

  1. 原来Github上的README.md文件这么有意思——Markdown语言详解

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 之前一直在使用github,也在上面分享了不少的项目和Demo,每次创建新项目的时候,使用的都是默认的REA ...

  2. myEclipse项目部署按钮失效了,怎么办?

    myEclipse项目部署按钮失效了,按了以后没反应,怎么办? 步骤如下: 1.首先关闭MyEclipse. 2.然后删除Workspaces目录(存放您MyEclipse项目的地方)下的 " ...

  3. js中的json对象

    1.JSON(JavaScript Object  Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不须要 ...

  4. 允许Ubuntu14.04&quot;保存&quot;屏幕亮度值

    Ubuntu / Debian 该系统有一个共同的问题,也就是说,每个引导.系统会打开你的屏幕亮度调至最高值. 我很奇怪,为什么14.04这一问题的版本号依然不动. 但是,我们可以做一个脚本Ubunt ...

  5. Base64编码和解码

    Base64这是一个二进制编码方法转换成可打印字符.主要用于邮件传输. Base64将64人物(A-Z,a-z,0-9,+,/)由于基本字符集.把所有的符号转换成字符集. 编码: 编码每次3节转为4字 ...

  6. 相关Python分割操作

    刚论坛python文本 http://bbs.byr.cn/#!article/Python/1693 攻克了一个关于python分片的问题. 问题: uesrList = ['1','2','3', ...

  7. Centos根据系统VPS安装SendMail组件使WordPress支持E-mail

    1.在putty在链接: yum install sendmail 2.启动SendMail: service sendmail start 3.检查SendMail是否在监听默认的25port: n ...

  8. Webpact打包React后端Node+Express

    Webpact打包React后端Node+Express 前言 React官方推荐用Browserify或者Webpack 来开发React组件. Webpack 是什么?是德国开发者 Tobias ...

  9. SQL Server中TempDB管理(version store的逻辑结构)

    原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...

  10. 【2014】【】辛星【php】【秋】【1】php构建开发环境

    **************************什么是开发环境*********************** 1.我们学习PHP,是使用它来做web用的,通俗理解,就是做站点. 2.站点的执行须要 ...