博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noip模拟赛 罪犯分组
阅读量:5303 次
发布时间:2019-06-14

本文共 1172 字,大约阅读时间需要 3 分钟。

分析:看了题后没别的思路,感觉就是dp,普通dp的话状态和方程实在是不好设计,观察数据,发现N非常小,暗示了这道题要用状压dp来做.

      先枚举每个集合,再用O(n^2)的暴力看这个集合内有多少个冲突,如果冲突数量不大于k,那么就可以分成1个集合了,否则一定要分成多个集合,那么枚举它的子集j,状态转移方程就出来了:f[i] = min{f[j] + f[i ^ j]} j是i的子集.

以后没思路要多往dp上面去想,还要注意看数据范围,有一个值特别小就很有可能是状压dp.

#include 
#include
#include
#include
using namespace std;const int inf = 0x7fffffff;int n, m, k,a[20][20],f[10000010];int main(){ scanf("%d%d%d", &n, &m, &k); for (int i = 1; i < (1 << n); i++) f[i] = inf; for (int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); a[x][y] = a[y][x] = 1; } for (int i = 1; i < (1 << n); i++) { int cnt = 0; for (int j = 1; j <= n; j++) for (int l = j + 1; l <= n; l++) if (a[j][l] && (i & (1 << (j - 1)) && (i & (1 << (l - 1))))) cnt++; if (cnt <= k) f[i] = 1; else { for (int j = i; j; j = (j - 1) & i) f[i] = min(f[i], f[j] + f[i ^ j]); } } printf("%d\n", f[(1 << n) - 1]); return 0;}

 

转载于:https://www.cnblogs.com/zbtrs/p/7581611.html

你可能感兴趣的文章
python小程序之一
查看>>
数据解析
查看>>
Spring Ioc原理
查看>>
关于深拷贝与浅拷贝的一些简单说明
查看>>
TCP三次握手和四次握手
查看>>
js 鼠标事件
查看>>
AnsiString用法(转)
查看>>
DP E - Cheapest Palindrome
查看>>
用TTL线在CFE环境下拯救半砖wrt54g路由器
查看>>
extjs grid renderer用法
查看>>
来博客园的第一篇博文
查看>>
在cmd窗口中运行php命令
查看>>
浅议约瑟夫问题
查看>>
mysql数据库之存储引擎
查看>>
【刷题】BZOJ 2734 [HNOI2012]集合选数
查看>>
【刷题】BZOJ 2287 【POJ Challenge】消失之物
查看>>
通过 UI 管理 docker
查看>>
Linux ip netns 命令
查看>>
position三种属性的区别
查看>>
python进阶学习笔记(四)--多线程thread
查看>>