HDU 5117:Fluorescent(状压DP + 思维)***
题意
给出n个灯,m个开关,每个开关控制一些灯,如果打开这个开关,这个开关控制的灯如果本来灭的就会亮,如果本来亮的就会灭。问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和。
思路
对于枚举2^m种情况是不实际的。题目要求的求立方和暗含玄机。
设每个灯的状态为X。
ans = X^3 = (X1 + X2 + X3 + ... + Xn) * (X1 + X2 + X3 + ... + Xn) * (X1 + X2 + X3 + ... + Xn)
= X1 * X1 * X1 + X1 * X1 * X2 + X1 * X1 * X3 + ... + Xn * Xn * Xn
意味着只有当前枚举的三个灯同时亮,才会对最后的答案有贡献。
可以枚举三个灯,然后状态压缩三个灯的情况,然后累加求解。
dp[x][st] 代表使用前 x 个开关得到状态为 st 的情况有多少种。
dp[x][st] += dp[x-1][st] (不使用开关的情况)。
dp[x][now] += dp[x-1][st] (使用开关的情况,now为状态为 st 的情况打开了第 x 个开关后的状态)。
ans += dp[m][7] (因为只有三个灯一起亮才对结果有贡献,7就是三个灯状压后全亮的情况)。
复杂度O(n^3 * m * 7)。
···C++
include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int N = 50 + 11;
const int MOD = 1e9 + 7;
LL op[N];
int dp[N][11];
int main() {
int t; scanf("%d", &t);
for(int cas = 1; cas <= t; cas++) {
printf("Case #%d: ", cas);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++) {
int x; scanf("%d", &x); op[i] = 0;
for(int j = 0; j < x; j++) {
int y; scanf("%d", &y); y--;
op[i] |= (1LL << y);
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int x = 0; x < m; x++) {
for(int st = 0; st < 8; st++) {
int now = st;
if(op[x] & (1LL << i)) now ^= 1;
if(op[x] & (1LL << j)) now ^= 2;
if(op[x] & (1LL << k)) now ^= 4;
dp[x+1][st] = (dp[x+1][st] + dp[x][st]) % MOD; // off
dp[x+1][now] = (dp[x+1][now] + dp[x][st]) % MOD; // On
}
}
ans = (ans + dp[m][7]) % MOD;
}
}
}
printf("%d\n", ans);
}
return 0;
}
```
HDU 5117:Fluorescent(状压DP + 思维)***的更多相关文章
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- hdu 4114(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...
- HDU 3091 - Necklace - [状压DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 3811 Permutation 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...
- hdu-5117 Fluorescent(状压dp)
题目链接: Fluorescent Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Oth ...
随机推荐
- maven私服nexus安装
maven私服nexus安装 1.nexus特性 1.1.nexus私服实际上是一个javaEE的web 系统 1.2.作用:用来管理一个公司所有的jar包,实现项目jar包的版本统一 1.3.jar ...
- go语言学习之路(一)
Go 语言简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发, ...
- 2015微软创新杯Imaginecup正在进行参赛(报名截止日期2014年12月31日本23:59)
CSDN高校俱乐部与微软官方合作,2015微软创新杯大赛中国区官网落户CSDN高校俱乐部:http://student.csdn.net/mcs/imaginecup2015 在微软官方设置创新杯中国 ...
- Entity种类(动态代理)
动态代理:延迟加载+自动化修改跟踪满足条件 修改方式见修改EF设置eg. 测试 结果
- Bootstrap路径导航
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- WPF自定义窗口最大化显示任务栏
原文:WPF自定义窗口最大化显示任务栏 当我们要自定义WPF窗口样式时,通常是采用设计窗口的属性 WindowStyle="None" ,然后为窗口自定义放大,缩小,关闭按钮的样式 ...
- Post ,Get 请求
http://blog.csdn.net/pan_junbiao/article/details/9155497
- python3 无法使用flask.ext.* 报错的解决方法
python3 使用flask的一些扩展功能的导入方法是 from flask_bootstrap import Bootstrapfrom flask_moment import Momentfro ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法
原文:[全面解禁!真正的Expression Blend实战开发技巧]第一章 真正的开发中的最佳的做法 从设计者到开发者 设计师创建一个应用程序的布局然后让开发者去实现. 从开发者到设计者 开发者创建 ...
- Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法
Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法 打算放在CSDN进行下载的,上传完成后发现资源分设置的1分,本打算赚点下载分的.在页面上没有 ...