UVA 11795 Mega Man's Mission——dp

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/82350454
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int T, ks, n, m;
char str[20];
int t[20], kl[1<<18];
ll dp[1<<18];
int main(){
    scanf("%d", &T);
    for (int ks = 1; ks <= T; ks++) {
        scanf("%d", &n);
        for (int i = 0; i <= n; i++) {
            scanf("%s", str);
            t[i] = 0;
            for (int j = 0; str[j]; j++) if (str[j] == '1') t[i] |= (1<<j);
        }
        m = (1<<n)-1;
        for (int i = 0; i <= m; i++) {
            kl[i] = t[0];
            dp[i] = 0;
            for (int j = 0; j < n; j++) if (i & (1<<j)) kl[i] |= t[j+1];
        }
        dp[0] = 1;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if ((kl[i]&(1<<j)) && !(i&(1<<j))) dp[i|(1<<j)] += dp[i];
            }
        }
        printf("Case %d: %lld\n", ks, dp[m]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/82350454