zoukankan      html  css  js  c++  java
  • 题解 UVA11795 【Mega Man's Mission】

    题目链接:Link

    Solution

    小心溢出! 小心溢出! 小心溢出!

    这道题是一个很典型的状压DP,唯一要注意的是要小心溢出。

    刷表法:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=16;
    int T,n;
    int wep[1<<maxn];
    long long dp[1<<maxn];
    char s[maxn+5];
    int main()
    {
    #ifdef local
    	freopen("pro.in","r",stdin);
    #endif
    	scanf("%d",&T);
    	for(int kase=1;kase<=T;kase++)
    	{
    		scanf("%d",&n);
    		scanf("%s",s);
    		memset(wep,0,sizeof(wep));
    		memset(dp,0,sizeof(dp));
    		for(int i=strlen(s)-1;i>=0;i--)
    			wep[0]|=(int)(s[i]-'0')<<i;
    		for(int i=0;i<n;i++)
    		{
    			scanf("%s",s);
    			wep[1<<i]=wep[0];
    			for(int j=strlen(s)-1;j>=0;j--)
    				wep[1<<i]|=(int)(s[j]-'0')<<j;
    		}
    		for(int s=0;s<(1<<n);s++)
    		{
    			wep[s]|=wep[0];
    			for(int i=0;i<n;i++)
    				if(s&(1<<i)) wep[s]|=wep[1<<i];
    		}
    		dp[0]=1;
    		for(int s=0;s<(1<<n);s++)
    		{
    			if(dp[s]==0) continue;
    			for(int i=0;i<n;i++)
    				if((wep[s]&(1<<i))&&!(s&(1<<i)))
    					dp[s|(1<<i)]+=dp[s];
    		}
    		printf("Case %d: %lld
    ",kase,dp[(1<<n)-1]);
    	}
    	return 0;
    }
    /*
    0 1 2
    0 2 1
    1 0 2
    */
    

    填表法:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=16;
    int T,n;
    int wep[1<<maxn];
    long long dp[1<<maxn];
    char s[maxn+5];
    int main()
    {
    #ifdef local
        freopen("pro.in","r",stdin);
    #endif
        scanf("%d",&T);
        for(int kase=1;kase<=T;kase++)
        {
            scanf("%d",&n);
            scanf("%s",s);
            memset(wep,0,sizeof(wep));
            memset(dp,0,sizeof(dp));
            for(int i=strlen(s)-1;i>=0;i--)
                wep[0]|=(int)(s[i]-'0')<<i;
            for(int i=0;i<n;i++)
            {
                scanf("%s",s);
                wep[1<<i]=wep[0];
                for(int j=strlen(s)-1;j>=0;j--)
                    wep[1<<i]|=(int)(s[j]-'0')<<j;
            }
            for(int s=0;s<(1<<n);s++)
            {
                wep[s]|=wep[0];
                for(int i=0;i<n;i++)
                    if(s&(1<<i)) wep[s]|=wep[1<<i];
            }
            dp[0]=1;
            for(int s=1;s<(1<<n);s++)
                for(int i=0;i<n;i++)
                    if((s&(1<<i))&&(wep[s^(1<<i)]&(1<<i)))
                        dp[s]+=dp[s^(1<<i)];
            printf("Case %d: %lld
    ",kase,dp[(1<<n)-1]);
        }
        return 0;
    }
    
  • 相关阅读:
    [go]go addressable 详解
    [go]灵活的处理json与go结构体
    [django]django内置的用户模型
    [go]文件读写&io操作
    *2.3.2_加入env
    UVM_INFO
    uvm_config_db在UVM验证环境中的应用
    *2.2.4 加入virtual interface
    *2.2.3 加入objection机制
    2.2.2 加入factory机制
  • 原文地址:https://www.cnblogs.com/happyZYM/p/11380018.html
Copyright © 2011-2022 走看看