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 ...
随机推荐
- Lizcst Software Lab新秀品牌上线!
科友微电机是Lizcst Software Lab旗下品牌新秀,专业经营各种微型特种直流电机.微型发电机.微型电机配件.航模车模船模素材.教学科学小制作材料的网店.本店秉承Lizcst Softwar ...
- ubuntu 16.04快速安装ceph集群
准备工作 假设集群: 选一台作管理机 注意: ceph集群引用hostname,而非ip. 172.17.4.16 test16 #hostname必须是test16 172.17.4.17 test ...
- v-charts显示标题
使用v-charts的时候,如果要显示标题需要以下操作 1. 加入:title props <ve-pie :title="chartTitle" :data="c ...
- WPF 打印实例
原文:WPF 打印实例 在WPF 中可以通过PrintDialog 类方便的实现应用程序打印功能,本文将使用一个简单实例进行演示.首先在VS中编辑一个图形(如下图所示). 将需要打 ...
- 关于IOS7以及向下兼容音量控制问题
最近做个简单的播放界面,只是简单的设计到播放音频,ios系统自带播放有四个类可以播放音频 AVPlayer,AVAudioPlayer,MPMusicPlayerController,MPMovieP ...
- 将QuickReport报表保存为图片(使用TMetaFile和TMetafileCanvas)
//将报表第iPageNo页存为BMP文件 procedure ReportSaveToBMPFile(sFileName :string; iPageNo :integer) ...
- 全面剖析Redis Cluster原理和应用 (good)
redis redis cluster注意的问题 : 1.‘cluster-require-full-coverage’参数的设置.该参数是redis配置文件中cluster模式的一个参数,从字面上基 ...
- Win8 Metro(C#)数字图像处理--3.2图像方差计算
原文:Win8 Metro(C#)数字图像处理--3.2图像方差计算 /// <summary> /// /// </summary>Variance computing. / ...
- git 笔记-初始化
进入项目所在的文件夹 git init git remote add origin https://github.com/enderlu/test.gitgit push -u origin mast ...
- How to create my own self signed certificate chain?
--Refer to https://superuser.com/questions/126121/how-to-create-my-own-certificate-chain for detail. ...