链接:

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. HDU 2017 一系列统计数据

    一系列统计数据 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  2. H. 硬币的水问题II

    H. 硬币水题II Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: ...

  3. js怎样推断一个对象{}是否为空对象,没有不论什么属性

    js怎样推断一个对象{}是否为空对象,没有不论什么属性 前段时间用js写了一个相似"angularjs"用于数据绑定的东西,功能是比較简单了, 通常应该传进来的是一个ArrayLi ...

  4. Memcahce(MC)系列(三)Memcached它PHP转让

    由PHP转让Memcahce,首先,需要在server安装Memcache,如何安装Memcache这不是本文的重点, 大约memcache安装,谁的朋友有兴趣,请参阅这里:http://blog.c ...

  5. Mysql 演示示例存储过程

    DELIMITER $ CREATE PROCEDURE generate_Equipment(district INT,warehouseNO VARCHAR(10) ) BEGIN  DECLAR ...

  6. Java学习路径:不走弯路,这是一条捷径

    1.如何学习编程? JAVA是一种平台.也是一种程序设计语言,怎样学好程序设计不只适用于JAVA,对C++等其它程序设计语言也一样管用.有编程高手觉得,JAVA也好C也好没什么分别,拿来就用.为什么他 ...

  7. MEF初体验之一:在应用程序宿主MEF

    在MEF出现以前,其实微软已经发布了一个类似的框架,叫MAF(Managed Add-in Framework),它旨在使应用程序孤立和更好的管理扩展,而MEF更关心的是可发现性.扩展性和轻便性,后者 ...

  8. Docker系列之(一):10分钟玩转Docker(转)

    1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是 ...

  9. LNK快捷方式漏洞利用方式 exp制作教程

    前言windows的shell32在处理控制面板程序的快捷方式文件时,存在一个漏洞,能够载入硬盘上的随意DLL文件,就可以运行随意代码. 漏洞文件的生成到“控制面板”以下,右键点“显示”,点“创建快捷 ...

  10. C#依据word模版动态生成文档

    新生开学,各院系辅导员代领校园卡.需要打印一份领取卡的协议,协议模版固定,但各院系卡的数量不同.需要从excel表格中抽取数据往word文件中填,同事咨询是否可以用word中的邮件合并功能,心想有这功 ...