zoukankan      html  css  js  c++  java
  • bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 515  Solved: 348
    [Submit][Status][Discuss]

    Description

      铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子。现在铭铭想用绳子把所有的珠子连接成一个整体。
      现在已知所有珠子互不相同,用整数1到n编号。对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接。如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图。特别地,珠子不能和自己连接。
      铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体。由于答案可能很大,因此只需输出答案对1000000007取模的结果。

    Input

     标准输入。输入第一行包含一个正整数n,表示珠子的个数。接下来n行,每行包含n个非负整数,用空格隔开。这n行中,第i行第j个数为ci,j。

    Output

     标准输出。输出一行一个整数,为连接方案数对1000000007取模的结果。

    Sample Input

    3
    0 2 3
    2 0 4
    3 4 0

    Sample Output

    50

    HINT

      对于100%的数据,n为正整数,所有的ci,j为非负整数且不超过1000000007。保证ci,j=cj,i。每组数据的n值如下表所示。
    编号 1 2 3 4 5 6 7 8 9 10  
    n      8 9 9 10 11 12 13 14 15 16 

    Source

    2012国家集训队Round 1 day1

     

    感觉还是有点不懂,这个dp来的莫名其妙
    g[s]表示状态为s的点之间任意连边方案数
    f[s]表示s点集构成连通块方案数
    g[]很容易求

    现在考虑f[s]应该怎么求
    枚举s子集 把s划分成2个部分s1,s2,f[s]+=f[s1]*g[s2]
    为什么这么转移可以得到答案呢?
    因为这样可以保证s1和s2之间相互没有连边且可以枚举完所有子集情况又不会重复
    感性理解。。

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define mod 1000000007
    #define N 20
    #define M 101000
    using namespace std;
    int n,S,a[N][N];
    long long f[M],g[M];
    
    int main()
    {
        int i,j,k,now;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
        S=1<<n;
        for(i=1;i<S;i++)
        {
            g[i]=1;
            for(j=0;j<n;j++)if(i&(1<<j))
                for(k=j+1;k<n;k++)if(i&(1<<k))
                    g[i]=g[i]*(a[j][k]+1)%mod;
            f[i]=g[i];
            for(j=n-1;j+1;j--)
                if(i&(1<<j)){now=j;break;}
            now=i^(1<<now);
            for(j=now;j;j=(j-1)&now)
                f[i]=(f[i]-g[j]*f[i^j]%mod+mod)%mod;
        }
        cout<<f[S-1];
    }
  • 相关阅读:
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 344 反转字符串
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
  • 原文地址:https://www.cnblogs.com/wsy01/p/8031101.html
Copyright © 2011-2022 走看看