zoj月赛的题目,非常不错的一个状压dp。。

题目大意是一个一维的2048游戏

只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取

问最终得到的最大值

数据范围n<=500 , a[i]={2,4,8,16};

分析:

首先明确一下自动合并的意思,比如原有 8,4,2,进入一个2 就会变成16

所以我们需要记录前面的所有数字。。计算了一下发现最大情况,500个16会合成4096 =2^12

显然全部记录是不可能的。那么怎么处理呢

我们发现,只有递减的序列才有可能向前合并。。所以我们只需要记录某个状态末尾的递减序列即可

最大数只有2^12,所以递减序列个数只有2^13-1种,可以记录了。。

之后就是状态转移的问题了。

不取当前数状态不变

取当前数分三种情况

1.前面有比当前数更小的,则如果取这个数,递减序列将只有这一个数

2.前面的末尾恰好跟当前数相等,那么向上合并直至不能合并为止

3.前面的末尾比当前数大,那么直接将当前数插入状态中

具体实现看代码,用了一点位运算挺有意思的

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define MAXN 10000
int dp[2][8200];
int a[505];
int main()
{#ifndef ONLINE_JUDGE//freopen("in.txt","r",stdin);#endifint T,n;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",a+i);}memset(dp,-1,sizeof(dp));dp[1][0]=0;dp[1][a[1]]=a[1];for(int i=2;i<=n;i++){for(int j=0;j<=8191;j++){if(dp[(i-1)%2][j]==-1){continue;}dp[i%2][j]=max(dp[i%2][j],dp[(i-1)%2][j]);           //不取if(j&(a[i]-1)){dp[i%2][a[i]]=max(dp[i%2][a[i]],dp[(i-1)%2][j]+a[i]);     //情况1continue;    }int state,score;if(j&a[i]){int tmp=j/a[i],k=0;score=a[i];while(tmp%2){k++;tmp/=2;score+=a[i]<<k;}state=((tmp<<k)*a[i])|(a[i]<<k);dp[i%2][state]=max(dp[i%2][state],dp[(i-1)%2][j]+score);  //情况2continue;}state=j|a[i];score=a[i];dp[i%2][state]=max(dp[i%2][state],dp[(i-1)%2][j]+score);      //情况3
            }}int ans=-1;for(int i=0;i<8192;i++){ans=max(ans,dp[n%2][i]);}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/oneshot/p/4065859.html

zoj3802:easy 2048 again(状压dp)相关推荐

  1. 郊区春游(状压dp)

    链接:https://ac.nowcoder.com/acm/contest/134/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge 状压DP

    题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest with n (0 < n \le 20)n(0& ...

  3. ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  4. ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge 状压dp

    Dlsj is competing in a contest with n(0<n≤20)n (0 < n \le 20)n(0<n≤20) problems. And he kno ...

  5. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  6. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  7. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  8. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  9. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

最新文章

  1. 强化学习—— TD算法(Sarsa算法+Q-learning算法)
  2. 非自回归也能预训练:基于插入的硬约束生成模型预训练方法
  3. wxWidgets:显示和测试 wxDC 功能
  4. 使用setup函数替代beforeEach函数进行Angular单元测试
  5. 二叉树的几道相似简单递归题
  6. python子进程修改父进程内变量_如何将父变量传递给python中的子进程?
  7. oracle 设置会话的编码,在Oracle中使用登录触发器初始化用户会话
  8. matlab 亚像素边缘检测,一种亚像素边缘检测方法与流程
  9. G - The Tourist Guide UVA - 10099
  10. Unity3D之FingerGestures使用
  11. 令人拍案叫绝的Wasserstein GAN 及代码(WGAN两篇论文的中文详细介绍)
  12. VirtualBox 虚拟机里网络很慢的解决方法
  13. AttributeError: module ‘scipy.signal‘ has no attribute ‘correlation_lags‘
  14. MSTAR-晨星半导体
  15. hive的窗口函数详解
  16. 离线数仓 (十三) --------- DWD 层搭建
  17. vs2015编译基于obs-studio的阿里巴巴直播工具tblive
  18. 福慧双修探险 BZOJ4398BZOJ2407
  19. Cisco 路由器与ASA防火墙 Site-to-Site IPsec
  20. html里面的按钮标记是什么意思,html button标签是什么意思?html button标签的使用细节...

热门文章

  1. logback.xml中MaxHistory日志文件保留天数
  2. redis 将key的有效时间设置为不过期命令
  3. Ubuntu18.04 安装nextcloud
  4. Mysql替换字段中的内容
  5. 为什么SpringBoot中main方法执行完毕后程序不会直接退出呢
  6. Android开发笔记(一百六十三)高仿京东的沉浸式状态栏
  7. Android开发笔记(三十九)Activity的生命周期
  8. Spring MVC开启注解
  9. P3175 [HAOI2015]按位或
  10. 27.将 VMware 服务器上的虚拟机备份到 Azure(上)