题目大意:

给定一个序列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)的更多相关文章

  1. 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 ...

  2. 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)

    点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...

  3. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  4. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  5. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  6. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  7. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  8. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  9. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  10. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

随机推荐

  1. 构建ExtJS 6.x程序

    构建ExtJS 6.x程序 ExtJS也有自己的打包工具 SenchaCmd,它用来生成构建ExtJS前端组织架构,最后打包发布生产,操控着前端整个开发生命周期,SenchaCmd依赖于JDK,所以要 ...

  2. 商城项目:商品列表ajax加载,ajax加入购物车--五张表的联合查询

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ProductLists.a ...

  3. Leecode刷题之旅-C语言/python-66加一

    /* * @lc app=leetcode.cn id=66 lang=c * * [66] 加一 * * https://leetcode-cn.com/problems/plus-one/desc ...

  4. WHERE条件中or与union引起的全表扫描的问题

    说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解 ...

  5. powerpoint教程资料,PPT的

    Powerpoint,是微软公司设计的演示文稿软件,利用Powerpoint不仅可以创建演示文稿,还可以在互联网上召开面对面会议.远程会议或在网上给观众展示演示文稿,掌握利用PowerPoint是一项 ...

  6. linux文件操作篇 (四) 目录操作

    #include <sys/stat.h>#include <unistd.h>#include <dirent.h> //创建文件夹 路径 掩码 int mkdi ...

  7. FIFO队列(First In First Out)和优先队列

    queue<类型名> q; q.size() - 返回队列中元素个数 q.empty() - 若队列为空,返回true ,否则返回false q.pop() - 删除队首元素,但不返回其值 ...

  8. 数据库 MySQL part2

    表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...

  9. 关于 js 对象 转 字符串 和 深拷贝 的探讨

    随着更多语言的支持 **json** 作为数据传输和存储的媒体,已经非常成熟且应用广泛.却存在致命硬伤,不携带 **对象方法** .在数据传输和存储中,这是恰当的和合理的. 但是在更多的应用场景中,又 ...

  10. 洛谷P2307 迷宫

    怎么又是一道叫迷宫的题呀QWQ 题目链接 这道题主要是对并查集的考察,需要注意的坑点在于有可能存在的不止一个联通块. 我们只需要对输入的两个数据进行判断,如果在一个集合中证明有多条路则输出0,如果不在 ...