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) ...
随机推荐
- 【ssh服务配置】
根据项目需求,搭建好拓扑图如下: 第一种验证方式:给予密码和用户名登录 Ssh server配置: 首先在服务器上创建一个rsa加密算法的秘钥对: 对ssh服务进行开启: 创建用户的虚拟终端登录界面: ...
- Windows使用Node.js自动生成Vue.js模版环境部署步骤-----记录
node.js官网下载并安装node 进入node文档目录下,运行cmd 输入 node -v 查看node版本 出现表示安装完成 输入 npm -v 显示npm版本信息 安装cnpm 输入 npm ...
- Java应用:经纬度匹配(geohash加密)
本文采用http://gc.ditu.aliyun.com地址进行经纬度匹配,无数量限制 如果给定经纬度进行geohash加密操作,先解密得到相应gps坐标,具体程序如下所示: import java ...
- python 排列组合
笛卡尔积(product): 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2) ...
- python学习之字符串常用方法和格式化字符串
Python中的字符串同样适用标准的序列操作(索引,分片,乘法,成员判断,求长度,取最小值和最大值),但因为字符串是不可变的,因此字符串不支持分片赋值. s='http://www.baidu.com ...
- (数据科学学习手札11)K-means聚类法的原理简介&Python与R实现
kmeans法(K均值法)是麦奎因提出的,这种算法的基本思想是将每一个样本分配给最靠近中心(均值)的类中,具体的算法至少包括以下三个步骤: 1.将所有的样品分成k个初始类: 2.通过欧氏距离将某个样品 ...
- [POJ1785]Binary Search Heap Construction(笛卡尔树)
Code #include <cstdio> #include <algorithm> #include <cstring> #define N 500010 us ...
- BZOJ2693: jzptab(莫比乌斯反演)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2068 Solved: 834[Submit][Status][Discuss] Descripti ...
- ES6--Set之再理解
Set 其实2016年就看过阮大神的ECMAScript 6 入门,当时看了Set之后,大致看懂了,但事实上根本没有理解Set到底是什么,所以更记不住,平时做项目大多用到的还是ES5的传统写法,以至于 ...
- oracle 数据被修改怎么修复?(闪回)
数据被删除 或者 update 的时候忘记勾选where 限制条件,数据全部更新了? 怎么办? 要跑路了? NO !!! 看下面,迅速帮你闪回数据! demo sql: 1. SELECT * FR ...