<hdu多校 round3>

Solved:4

rank:268

C. Dynamic Graph Matching  状压DP一下

#include <stdio.h>
#include <algorithm>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;

ll dp[1 << 10];
ll ans[7];
int num[1 << 10];

void work()
{
    int len = 1 << 10;
    for(int i = 1; i < len; i++)
    {
        int x = i;
        while(x)
        {
            if(x & 1) num[i]++;
            x >>= 1;
        }
    }
}


int main()
{
    work();
    int T;
    scanf("%d", &T);
    while(T--) 
    {
        int n, m;
        scanf("%d%d", &n, &m);
        memset(dp, 0, sizeof(dp));
        memset(ans, 0, sizeof(ans));
        dp[0] = 1;
                
        char s[5];
        int len  = 1 << n;
        for(int i = 1; i <= m; i++)
        {
            int a, b;
            scanf("%s", s);
            scanf("%d%d", &a, &b);
            a--, b--;
            
            int tmp = (1 << a) | (1 << b);
            for(int i = 1; i < len; i++)
            {
                if(num[i] & 1) continue;
                if((i & tmp) == tmp)
                {
                    if(s[0] == '+')
                    {
                        dp[i] = (dp[i] + dp[i - tmp]) % mod;
                        ans[num[i] / 2] += dp[i - tmp];
                        ans[num[i] / 2] %= mod;
                    }
                    else
                    {
                        dp[i] -= dp[i - tmp];
                        dp[i] = (dp[i] + mod) % mod;
                        ans[num[i] / 2] -= dp[i - tmp];
                        ans[num[i] / 2] += mod;
                        ans[num[i] / 2] %= mod;
                    }
                }    
            }
            for(int i = 1; i <= n / 2; i++)
            {
                if(i == 1) printf("%d", ans[i]);
                else printf(" %d", ans[i]);    
            }
            puts("");
        }
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/lwqq3/p/9393302.html
今日推荐