zoj3802:easy 2048 again(状压dp)
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)相关推荐
- 郊区春游(状压dp)
链接:https://ac.nowcoder.com/acm/contest/134/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 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& ...
- 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 ...
- 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 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日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 ...
最新文章
- 强化学习—— TD算法(Sarsa算法+Q-learning算法)
- 非自回归也能预训练:基于插入的硬约束生成模型预训练方法
- wxWidgets:显示和测试 wxDC 功能
- 使用setup函数替代beforeEach函数进行Angular单元测试
- 二叉树的几道相似简单递归题
- python子进程修改父进程内变量_如何将父变量传递给python中的子进程?
- oracle 设置会话的编码,在Oracle中使用登录触发器初始化用户会话
- matlab 亚像素边缘检测,一种亚像素边缘检测方法与流程
- G - The Tourist Guide UVA - 10099
- Unity3D之FingerGestures使用
- 令人拍案叫绝的Wasserstein GAN 及代码(WGAN两篇论文的中文详细介绍)
- VirtualBox 虚拟机里网络很慢的解决方法
- AttributeError: module ‘scipy.signal‘ has no attribute ‘correlation_lags‘
- MSTAR-晨星半导体
- hive的窗口函数详解
- 离线数仓 (十三) --------- DWD 层搭建
- vs2015编译基于obs-studio的阿里巴巴直播工具tblive
- 福慧双修探险 BZOJ4398BZOJ2407
- Cisco 路由器与ASA防火墙 Site-to-Site IPsec
- html里面的按钮标记是什么意思,html button标签是什么意思?html button标签的使用细节...