SRM709 div1 Xscoregame(状压dp)
题目大意:
给定一个序列a,包含n个数(n<=15),每个数的大小小于等于50
初始时x = 0,让你每次选a中的一个数y,使得x = x + x^y
问如何安排选择的次序,使得最终结果最大。
考虑状态压缩,dp[S]表示选了S状态的数的最大结果
我们发现这样做是错误的,因为目前的最大并不意味最后的最大
但是我们会发现,y最大只有50,所以x的大于63的部分不会发生变化,只有小于64的部分会受到y异或的结果
所以我们用dp[S][t]表示:选了S状态的数,小于64部分为t是否可行
然后用dp[S][64]代表大于64部分的大小
选第i个数加入的转移就是,先求出小于64部分与A[i]异或的最大值Max
然后大于64部分的大小就是2*dp[S][64] + (Max>>6)
找到所有小于64部分的异或>>6大于1的值,然后更新那些可行的状态即可
最后输出就是大于64的部分<<6再加上小于64部分最大的可行解
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <typeinfo>
#include <fstream>
#include <queue>
using namespace std;
void print(int x){
cout<<"*";
while(x){
if(x&) cout<<;
else cout<<;
x>>=;
}
cout<<endl;
}
long long dp[(<<) + ][];
queue<int> Q;
int vis[(<<) + ]; void Find(int S){
for(int i = ; i < ; i++) if(dp[S][i]) cout<<i<<" "; cout<<dp[S][];
cout<<endl;
} class Xscoregame {
public:
int getscore(vector<int> A) {
int n = A.size();
Q.push();
dp[][] = ;
while(!Q.empty()){
int S = Q.front(); Q.pop();
//print(S);
//Find(S);
for(int i = ; i < n; i++){
if(S&(<<i)) continue;
int Max = ;
for(int j = ; j < ; j++){
if(!dp[S][j]) continue;
Max = max(Max, j + (j^A[i]));
}
if(Max == ) continue;
if(dp[S|(<<i)][] > *dp[S][] + (Max>>)) continue;
if(dp[S|(<<i)][] != *dp[S][] + (Max>>))
for(int j = ; j < ; j++) dp[S|(<<i)][j] = ;
if(!vis[S|(<<i)]) Q.push(S|(<<i)); vis[S|(<<i)] = ;
dp[S|(<<i)][] = *dp[S][] + (Max>>);
for(int j = ; j < ; j++){
if(!dp[S][j]) continue;
int temp = j + (j^A[i]);
if((temp>>) == (Max>>)) dp[S|(<<i)][temp&] = ;
}
}
}
long long ans = , temp = ;
for(int i = ; i >= ; i--) if(dp[(<<n)-][i]) { temp = i; break; }
ans += (dp[(<<n)-][]<<) + temp;
return ans;
}
};
SRM709 div1 Xscoregame(状压dp)的更多相关文章
- CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]
题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1 5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)
点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
随机推荐
- Python 2.6.6升级到Python2.7.15
最近在使用Python处理MySQL数据库相关问题时,需要用到Python2.7.5及以上版本,而centos6.5等版本操作系统默认自带的版本为2.6.6,因此需要对python进行升级. Pyth ...
- 如何在hadoop中使用外部的python程序文件
业务场景大概是这样,我需要在公司hadoop集群上对博文进行结巴分词.我的数据是存储在hive表格中的,数据量涉及到五百万用户三个月内发的所有博文. 首先对于数据来说,很简单,在hive表格中就是两列 ...
- C语言实现简易扫雷
首先,写代码之前要将整体思路写出来: 扫雷游戏:1.需要两个二维数组,一个用来展示,一个用来放雷; 2.整体骨架在代码中都有注释说明; 3.游戏难度比较简单,适合初学者观看,如果有大佬看明白,可以指点 ...
- 函数:引用file类对象及io类对象作为参数打印文本及显示文本
#include <iostream> #include <fstream> #include <cstdlib> using namespace std; voi ...
- js数组长度
js数组长度,一般使用length 属性即可获取,但这个数组是个对象则只能使用以下方式 var t=typeof o; var length=0; if(t=='string'){ length=o. ...
- spfa专题
SPFA专题 1通往奥格瑞玛的道路 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每 ...
- 【Consul】关于健康检查的一点思考
健康检查是Consul提供的一项主要功能,其配置格式如下: { "check": { "id": "redis", "name&q ...
- 使用uniflash串口烧写CC3200的常见问题
1. 在正常情况下,cc3200的烧写使用的是芯片的PIN55和PIN57,只要把SOP2上拉既可正常烧写,常见问题是烧写的时候没有上拉SOP2,正常运行SOP2留空,IAR只能仿真调试,不能下载程序 ...
- 【个人训练】(ZOJ3983)Crusaders Quest
题意分析 和祖玛类似的那种玩法.不过是限定了九个字符,问最好情况下有几次三连碰. 暴力穷举即可.具体的做法是,先把所有"成块"的字符记录下来,然后一个一个删,再继续这样子递归做下去 ...
- idea在Maven Projects中显示灰色的解决办法
问题描述: 在使用idea的过程中,遇到其中一个maven模块变成灰色,如下所示: 问题解决: 造成这个的原因可能是忽略了maven模块. 可以尝试如下解决方法:在idea中进入Settings–&g ...