hdu6149 Valley Numer II 分组背包+状态压缩
/**
题目:hdu6149 Valley Numer II
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149
题意:
众所周知,度度熊非常喜欢图。
为了形成山谷,首先要将一个图的顶点标记为高点或者低点。
标记完成后如果一个顶点三元组<X, Y, Z>中,
X和Y之间有边,Y与Z之间也有边,同时X和Z是高点,Y是低点,那么它们就构成一个valley。
度度熊想知道一个无向图中最多可以构成多少个valley,一个顶点最多只能出现在一个valley中。
● 1≤T≤20
● 1≤N≤30
● 1≤M≤N*(N-1)/2
● 0≤K≤min(N,15)
● 1≤Xi, Yi≤N, Xi!=Yi
● 1≤Vi≤N
思路:由于k最大是15,所以可以分组背包+状态压缩 因为每两个高点和一个低点才能构成一个三元组,k最大15,所以最多7个三元组; 所有的低点作为分组条件。
每一组存入可以和该低点构成三元组的pair<x,z>,用s表示状态; dp[i][s]表示放入i体积,高点状态为s可以获得的最多三元组; dp[i][s] = max(dp[i][s],dp[i-1][s-s1]+1) (s&(s1)==0) ps:自己老是在这个地方搞错,dp[7][i]这里的第一维要开到8以上!!! */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int, int> P;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + ;
const int N =;
int dp[][<<];
vector<int> v[];
int f[][];
int gao[], pos[];
vector<int> g;
int main()
{
int T;
int n, m, k;
cin>>T;
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
ms(f,);
int x, y;
for(int i = ; i <= m; i++){
scanf("%d%d",&x,&y);
f[x][y] = ;
f[y][x] = ;
}
ms(gao,);
g.clear();
for(int i = ; i <= k; i++){
scanf("%d",&x);
pos[x] = i-;
g.push_back(x);
gao[x] = ;
}
for(int i = ; i<= n; i++) v[i].clear();
for(int i = ; i <= n; i++){
if(gao[i]==){
for(int j = ; j<g.size();j++){
for(int z = j+; z <g.size(); z++){
if(f[i][g[j]]&&f[i][g[z]]){
v[i].push_back((<<pos[g[j]])|(<<pos[g[z]]));
}
}
}
}
}
memset(dp, -inf, sizeof dp);
dp[][] = ;
int len = <<k;
for(int i = ; i <= n; i++){
if(gao[i]||(int)v[i].size()==) continue;
for(int j = ; j >= ; j--){
for(int x = ; x < v[i].size(); x++){
for(int y = ; y < len; y++){
if((y&v[i][x])==v[i][x]){
dp[j][y] = max(dp[j][y],dp[j-][y-v[i][x]]+);
}
}
}
}
}
int mas = ;
for(int i = ; i <= ; i++){
for(int j = ; j < len; j++){
mas = max(mas,dp[i][j]);
}
}
printf("%d\n",mas);
}
return ;
}
hdu6149 Valley Numer II 分组背包+状态压缩的更多相关文章
- hdu6125 Free from square 分组背包+状态压缩
/** 题目:hdu6125 Free from square 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6125 题意: 从不大于n的所有正整数中选出 ...
- POJ-2923 Relocation---01背包+状态压缩
题目链接: https://vjudge.net/problem/POJ-2923 题目大意: 有n个货物,给出每个货物的重量,每次用容量为c1,c2的火车运输,问最少需要运送多少次可以将货物运完 思 ...
- HDU 6149 Valley Numer II(状压DP)
题目链接 HDU6149 百度之星复赛的题目……比赛的时候并没有做出来. 由于低点只有15个,所以我们可以考虑状压DP. 利用01背包的思想,依次考虑每个低点,然后枚举每个状态. 在每个状态里面任意枚 ...
- POJ 2923 【01背包+状态压缩/状压DP】
题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...
- POJ 2923 Relocation(01背包+状态压缩)
题意:有人要搬家,有两辆车可以运送,有若干家具,车有容量限制,而家具也有体积,那么如何运送会使得运送车次最少?规定两车必须一起走,两车一次来回只算1躺. 思路:家具怎么挑的问题,每趟车有两种可能:1带 ...
- HDU 6149 Valley Numer II (状压DP 易错题)
题目大意:给你一个无向连通图(n<=30),点分为高点和低点,高点数量<=15,如果两个高点和低点都直接连边,那么我们称这三个点形成一个valley,每个点最多作为一个valley的组成部 ...
- HDU 6149 Valley Numer II 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...
- 百度之星复赛T6&&hd6149 ——Valley Numer II
Problem Description 众所周知,度度熊非常喜欢图. 它最近发现了图中也是可以出现 valley —— 山谷的,像下面这张图. 为了形成山谷,首先要将一个图的顶点标记为高点或者低点.标 ...
- HDU 6125 Free from square 状态压缩DP + 分组背包
Free from square Problem Description There is a set including all positive integers that are not mor ...
随机推荐
- Exdata cell 节点配置时遇到的一个问题
问题描写叙述: [celladmin@vrh4 ~]$ cellcli CellCLI: Release 11.2.3.2.0 - Production on Sat Jun 14 09:11:08 ...
- /etc/vsftpd.conf配置(ftp上传)
# Example config file /etc/vsftpd.conf## The default compiled in settings are fairly paranoid. This ...
- 数据库:mongodb与关系型数据库相比的优缺点zz (转)
与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值 ...
- mysql更新日志问题
[root@localhost ~]# /etc/init.d/mysqld restart 停止 mysqld: [确定] 正在启动 mysqld: [确定] 故障:今天在维护以前数据库日志的时候, ...
- ES6 class 基本使用
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- mysql 禁制远程连接
改表法:把host地址改为% use mysql; update user set host = '%' where user = 'root'and host="127.0.0.1&quo ...
- myql基准测试工具Sysbench
一.Sysbench介绍 SysBench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.它主要包括以下几种方式的测试: 1.cpu性能 2.磁盘io性 ...
- 【转帖】Service Discovery: 6 questions to 4 experts
https://highops.com/insights/service-discovery-6-questions-to-4-experts/ What’s Service Discovery? I ...
- “好奇号”火星车和它搭载的软件(来自Erlang程序员的观点)
http://www.aqee.net/on-curiosity-and-its-software/
- JAVA中==与equals的区别
equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们“实际意义上相等”,比较的是内容,而不是引用地址.Java中S ...