链接:

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. 最少拦截系统(杭电1257)(DP)+(贪心)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. 最新jhost免费jsp云空间会员邀请码

    jhost支持jsp.php的免费云空间,邀请码用于激活空间服务: 邀请码:20141003104317_149661                  有效期:2014-10-03 http://w ...

  3. linux 下修改 apache 启动的所属用户和组

    apache默认启动的用户和组是www-data,所以有些时候,就会涉及到权限问题,没有权限在执行目录下创建或者读写文件.改变用户和组的方法其实很简单: 1.进入到apache默认安装路径/etc/a ...

  4. 4.帧循环(游戏循环),schedule

     1 概述 游戏乃至图形界面的本质是不断地画图,然而画图并非任意的,不论什么游戏都须要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑.游戏逻辑会控制游戏内容,使其依据用户输入和时间流逝而改变. ...

  5. Golang基于学习总结

    1.不支持继承 重载 ,比方C++Java的接口,接口的改动会影响整个实现改接口的类行为的改动,Go 设计者觉得这一特点也许根本没用. 2.必不论什么函数定义必须花括号跟在函数声明后面而不能换行 如 ...

  6. 网络的基本概念TCP, UDP, 单播(Unicast), 多播(多播)(Multicast)

    章相当低级,但相当重要! 我们周围一切差点儿都依赖于把事情抽象成低等级,并在某一点把它详细化,在一些设计概念中.接口层十分清晰而且目标非常集中,应用程序不用考虑操作系统怎样工作,操作系统也不用考虑硬件 ...

  7. nsis 固定到任务栏

    nsis 固定到任务栏 win7以上有效 Name "测试" OutFile "test.exe" Section CreateShortCut "$ ...

  8. fastboot完成自己主动命令

    于Ubuntu13.10后来Ubuntu 14.04上,由APT安装fastboot以及adb该工具后, 发现fastboot在主动补充一个问题,, fastboot flash 自己主动有问题完成后 ...

  9. MKMapView移动事件地图

    MKMapView移动事件地图 by 吴雪莹 -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { ...

  10. 用Unicode迎接未来

         项目中使用了emoji,然后,问题产生了,后端MySQL数据库无法存储emoji字符,悲了个剧.      emoji是Unicode字符集的子集,Unicode的使用应该非常普遍了,怎么会 ...