hdu 5117 Fluorescent 数学展开式+dp
2016-09-21 16:33
417 查看
题目
题意:
给出一些个开关(m<=50),每个开关控制一些灯(一共有n个灯<=50),一旦按了开关,它所控制的灯都会切换一次状态,最开始所有灯都是灭的。现在每个开关最多按一次,求2m种情况下的E[x3],x为点亮的灯数。解:
求E[x3],其中x=x1+x2+x3,则x3=(x1+x2+x3+...+xn)∗(x1+x2+x3+...+xn)∗(x1+x2+x3+...+xn)
=∑xi∗xj∗xk
=C[i][j][k]∗xi∗xj∗xk(i<=j<=k)
(如果ijk相等,那么系数为1,如果互异,系数为6,否则为3)
现在我们就是要求所有情况下的x之和,即所有情况下的C[i][j][k]∗xi∗xj∗xk之和(i<=j<=k),
反过来说就下求[i][j][k]这种组合一共对应多少种开关状态,再乘以系数即可。
枚举i,j,k,然后用3位二进制保存状态,二维dp的另一维保存阶段,时间复杂度O(n3∗m∗8)=O(n3∗m)
AC代码:
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define all(x) (x).begin(), (x).end() #define for0(a, n) for (int (a) = 0; (a) < (n); (a)++) #define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++) #define mes(a,x,s) memset(a,x,(s)*sizeof a[0]) #define mem(a,x) memset(a,x,sizeof a) #define ysk(x) (1<<(x)) typedef long long ll; typedef pair<int, int> pii; const int INF =0x3f3f3f3f; const int maxn=50 ; int cur,n,m; bool G[maxn+5][maxn+5]; const ll mod=1e9 + 7.5; ll dp[maxn+5][8]; void update(int s,int ns) { dp[cur][s]=(dp[cur-1][s]+dp[cur-1][s^ns])%mod; } void solve() { ll ans=0; for1(i,n) { for(int j=i;j<=n;j++) { for(int k=j;k<=n;k++) { mem(dp,0); dp[0][0]=1; for(cur=1;cur<=m;cur++) { for0(s,8) { int ns=0; if(G[cur][i]) ns|=1; if(G[cur][j]) ns|=2; if(G[cur][k]) ns|=4; update(s,ns); } } if(i==j&&j==k) ans=(ans+dp[m][7])%mod; else if(i!=j&&i!=k&&j!=k) ans=(ans+6*dp[m][7])%mod; else ans=(ans+3*dp[m][7])%mod; } } } printf("%lld\n",ans); } int main() { std::ios::sync_with_stdio(false); int T,kase=0;cin>>T; while(T--) { cin>>n>>m; mem(G,0); for1(i,m) { int k,x;cin>>k; while(k--) { cin>>x; G[i][x]=1; } } printf("Case #%d: ",++kase); solve(); } return 0; }
反思:
为什么不从E[x]考虑,虽然不是问题所求,但不代表思考这个问题就没有帮助。状压不一定就要将时间复杂度*状态总数。
相关文章推荐
- HDU 5117 Fluorescent 数学展开DP
- HDU 5117 Fluorescent (数学 状压DP)
- HDU 5117 Fluorescent (数学+状压DP)
- 动态规划(DP计数):HDU 5117 Fluorescent
- hdu 5117 Fluorescent (求期望 + DP)
- HDU 5117 Fluorescent(状压DP)
- hdu-5117 Fluorescent(状压dp)
- hdu - 4972 - A simple dynamic programming problem(数学 + dp)
- 借助树的概率dp(期望)+数学-好题-hdu-4035-Maze
- hdu 4815 Little Tiger vs. Deep Monkey(数学+dp)
- hdu 4159 Indomie (DP,数学概率)
- HDU 4248 DP与组合数学
- HDU-5400 Arithmetic Sequence(数学 || DP)
- HDU 5396 Expression (数学期望+区间DP)
- HDU 5117 Fluorescent(期望+DP)
- HDU 2050 【dp】【简单数学】
- HDU 5117 Fluorescent
- HDU 5117(简单背包dp)
- HDU 4405 Aeroplane chess(概率dp,数学期望)
- HDU 5396 区间DP 数学 Expression