Codeforces 1105E 最大独立集 状态DP 中途相遇法
题意:你有一个字符串, 有两种操作,一种是改变字符串,一种是某个用户询问这个字符串,如果一个用户每次查询字符串的时候都是他的用户名,他就会高兴。问最多有多少个用户会高兴?
题意:容易发现,在两个1操作之间,如果有多个用户的的询问,只能满足一个。换句话说,如果满足了其中的一个,那么其它的便不能满足。我们可以对所有两个1之间的操作两两连边,那么问题就变成了最大独立集问题。
对于这个问题,可以用状压DP解决,但是最多有40个不同的用户,所以需要分成两半,分别预处理,然后枚举其中的一半,在保证于这边一半不相交的情况下,找到对应的另一半。
代码:
#include <bits/stdc++.h>
using namespace std;
int f[1 << 20], g[1 << 20];
map<string, int> mp;
int G[50][50];
vector<int> v;
int cnt;
string s;
int main() {
int n, m, op;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &op);
if (op == 1) {
v.clear();
continue;
} else {
cin >> s;
if(!mp.count(s))
mp[s] = cnt++;
v.push_back(mp[s]);
for (int j = 0; j < v.size() - 1; j++)
G[v[j]][v[v.size() - 1]] = G[v[v.size() - 1]][v[j]] = 1;
}
}
if(v.size()) {
for (int j = 0; j < v.size() - 1; j++)
G[v[j]][v[v.size() - 1]] = G[v[v.size() - 1]][v[j]] = 1;
}
int s1 = m / 2;
int s2 = m - s1;
for (int i = 0; i < (1 << s1); i++) {
for (int j = 0; j < s1; j++) {
if(((i >> j) & 1) == 0) {
int flag = 1;
for (int k = 0; k < s1; k++) {
if((i >> k) & 1)
if(G[j][k] == 1) {
flag = 0;
break;
}
}
f[i | (1 << j)] = max(f[i | (1 << j)], f[i] + flag);
}
}
}
for (int i = 0; i < (1 << s2); i++) {
for (int j = 0; j < s2; j++) {
if(((i >> j) & 1) == 0) {
int flag = 1;
for (int k = 0; k < s2; k++) {
if((i >> k) & 1)
if(G[j + s1][k + s1] == 1) {
flag = 0;
break;
}
}
g[i | (1 << j)] = max(g[i | (1 << j)], g[i] + flag);
}
}
}
int ans = 0;
for (int i = 0; i < (1 << s1); i++) {
int now = (1 << s2) - 1;
for (int j = 0; j < s2; j++) {
for (int k = 0; k < s1; k++) {
if((i >> k) & 1)
if(G[k][j + s1] == 1) {
now ^= (1 << j);
break;
}
}
}
ans = max(ans, f[i] + g[now]);
}
printf("%d\n", ans);
}
Codeforces 1105E 最大独立集 状态DP 中途相遇法的更多相关文章
- Codeforces 525E Anya and Cubes 中途相遇法
题目链接:点击打开链接 题意: 给定n个数.k个感叹号,常数S 以下给出这n个数. 目标: 随意给当中一些数变成阶乘.至多变k个. 再随意取一些数,使得这些数和恰好为S 问有多少方法. 思路: 三进制 ...
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- uva 6757 Cup of Cowards(中途相遇法,貌似)
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...
- LA 2965 Jurassic Remains (中途相遇法)
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...
- HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))
Difference Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 高效算法——J 中途相遇法,求和
---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- 【UVALive】2965 Jurassic Remains(中途相遇法)
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...
- uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)
用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ...
- LA 2965 中途相遇法
题目链接:https://vjudge.net/problem/UVALive-2965 题意: 有很多字符串(24),选出一些字符串,要求这些字符串的字母都是偶数次: 分析: 暴力2^24也很大了, ...
随机推荐
- number框
因为系统的number框无法设置样式,所以休息无聊时写了一个简单的模拟number框的插件,效果不是很完善,有一些功能可能没注意到 // 简单的模拟number框插件 // 布局: // <di ...
- windows下如何使用Git上传代码
首先,在使用Git的同时,我们需要拥有码云账号,在官网注册即可(官网:https://gitee.com/). 注册结束后创建一个代码仓库,最好和要上传的文件夹名字一样: 1.首先在电脑上安装wind ...
- 笔记72 高级SSM整合
遇到的问题: 1.进行spring mvc测试的时候报错 测试代码: package com.li.test; import com.github.pagehelper.PageInfo; impor ...
- 转帖 移动前端开发之viewport的深入理解
在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...
- SQL join的示意图
SQL join 用于把来自两个或多个表的行结合起来. 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法. 注意JOIN要和ON相连 ...
- Spring、SpringMVC、SpringBoot、SpringCloud概述
spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...
- Spring AOP中的JDK和CGLIB动态代理
Spring在将Advice织入目标对象的Joinpoint是在运行时动态进行的.它采用的方式可能有两种,即JDK动态代理与CGLIB代理.Spring会根据具体的情况在两者之间切换. 实际情况如下: ...
- C#的一些代码
form读取配置文件 /// <summary> /// 读取配置文件 /// </summary> /// <param name="key"> ...
- SpringDataJpa全部依赖
<properties> <spring.version>4.2.4.RELEASE</spring.version> <hibernate.version& ...
- doT模板引擎
doT模板引擎是一个比较高效的引擎,一直都在使用,只有3kb大小,简洁的语法,无任何依赖,简单易用:下面的代码直接拷贝引用就可以使用: 插件代码 (function(){function p(b,a, ...