链接:

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. DataGridView绑定数据源

    给DataGridView绑定数据源比較简单,方法主要有两种: 1.直接在控件属性中绑定数据源,这样的方法最简单,但它是直接连接数据库的,这样就和传DataTable的后果差点儿相同了,所以还是尽量避 ...

  2. 安装framework 3.5出现0x800F0922的解决方法

    关闭Windows 防火墙,启动Windows model install服务 重启! 再安装 就ok了

  3. Android源代码学习之六——ActivityManager框架解析

    ActivityManager在操作系统中有关键的数据,本文利用操作系统源代码,逐步理清ActivityManager的框架,并从静态类结构图和动态序列图两个角度分别进行剖析,从而帮助开发者加强对系统 ...

  4. Java实现 Base64、MD5、MAC、HMAC加密(转)

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  5. 《Hadoop》对于高级编程Hadoop实现构建企业级安全解决方案

    本章小结 ●    理解企业级应用的安全顾虑 ●    理解Hadoop尚未为企业级应用提供的安全机制 ●    考察用于构建企业级安全解决方式的方法 第10章讨论了Hadoop安全性以及Hadoop ...

  6. System.ComponentModel.BackgroundWorker在WinForm中的异步使用

    为了防止操作过程中界面卡死,和WinForm搭配最适合的就是BackgroundWorker了.BackgroundWorker 类 using System; using System.Compon ...

  7. ZOJ 3795 Grouping(Tarjan收缩点+DAG)

    Suppose there are N people in ZJU, whose ages are unknown. We have some messages about them. The i-t ...

  8. 从源代码分析modelDriven拦截器和params拦截器和拦截器prepare 和paramsPrepareParamsStack拦截器栈(让你的Struts2代码更简洁——如何培养框架设计能力

    源代码文件:Web App Libraries/struts2-core-2.3.15.3.jar/struts-default.xml 拦截器modelDriven: <interceptor ...

  9. win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置

    刚刚做过这类开发,所以就先献丑了,当然所贴上的源代码都是经过验证过的,已经执行成功了,希望能够给大家一些借鉴: 以下是metro UI代码: <Page x:Class="Camera ...

  10. SharePoint 2013 禁用搜索服务

    原文:SharePoint 2013 禁用搜索服务 前言,在SharePoint2013中,对于硬件需求的提升,让我们虚机里安装总是一筹莫展,尤其开启了搜索服务以后,对于内存的消耗就更加严重,尤其对于 ...