【状压DP】简单环

柔情只为你懂 2024-03-17 08:57 193阅读 0赞

怎么办,感觉现在所谓 会 的算法都是云的

以为自己会,然后随便出一道题就不会

云玩家是吧

好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦

好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑 好焦虑

c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m c n m

D-简单环_牛客竞赛动态规划专题班状压dp例题 (nowcoder.com)

题意:、ff65f75b3ce445c7a28bdc21ce69cd6f.png

思路:

即使一万年前我就写过这种题了,这并不妨碍我现在还不会做

考虑状压DP

设dp[s][u]表示走过的点集是s,最后一个点是u的链的数量

注意,是链的数量!不是简单环的数量

统计出来链的数量,自然就能统计环的数量了

60af52c60fe041c485963984a2f662e5.png

7312412c15204668ad91e2f1d930fb0f.png

Code:

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define low(x) log2(x&(-x))
  4. using namespace std;
  5. const int mxn=22;
  6. const int mxe=2e5+10;
  7. const int mod=998244353;
  8. int N,M,K,u,v;
  9. int G[mxn][mxn],dp[(1<<20)][mxn];
  10. int ans[mxn];
  11. int ksm(int a,int b,int mod){
  12. int res=1;
  13. while(b){
  14. if(b&1) res=(res*a)%mod;
  15. a=(a*a)%mod;
  16. b>>=1;
  17. }
  18. return res;
  19. }
  20. void solve(){
  21. cin>>N>>M>>K;
  22. for(int i=1;i<=M;i++){
  23. cin>>u>>v;
  24. u--,v--;
  25. G[u][v]=G[v][u]=1;
  26. }
  27. for(int i=0;i<N;i++) dp[(1<<i)][i]=1;
  28. for(int s=1;s<(1<<N);s++){
  29. int st=low(s);
  30. for(int u=0;u<N;u++){
  31. if(((s>>u)&1)==0) continue;
  32. if(dp[s][u]==0) continue;
  33. for(int v=st+1;v<N;v++){
  34. if((s>>v)&1) continue;
  35. if(!G[u][v]) continue;
  36. dp[s|(1<<v)][v]=(dp[s|(1<<v)][v]+dp[s][u])%mod;
  37. }
  38. if(G[u][st]){
  39. int cnt=__builtin_popcount(s);
  40. if(cnt<3) continue;
  41. ans[cnt%K]=(ans[cnt%K]+dp[s][u])%mod;
  42. }
  43. }
  44. }
  45. for(int i=0;i<K;i++){
  46. cout<<ans[i]*ksm(2,mod-2,mod)%mod<<'\n';
  47. }
  48. }
  49. signed main(){
  50. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  51. int __=1;//cin>>__;
  52. while(__--)solve();return 0;
  53. }

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DP简单

    怎么办,感觉现在所谓 会 的算法都是云的 以为自己会,然后随便出一道题就不会 云玩家是吧 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好烦 好

    相关 Codeforces 1215E DP

    题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段。 思路:由于题目中的颜色种类很少,考虑状压DP。设dp

    相关 group dp

      应某些人要求,我把标签删掉了   这是一道好题。   一看$c<=16$果断状压,但是怎么压?   一个很显然的思路是,枚举上下两层的状态,每一层的状态极限有$C(c

    相关 dp(瞎BB)

    最近在写状压dp,写得不太顺利啊,抠很久才抠出来。可见如此之菜。 状态压缩dp(简称状压dp)是一种非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数