c_cpp UVa 10817 - 校长的头痛

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp UVa 10817 - 校长的头痛相关的知识,希望对你有一定的参考价值。

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int MAXN=1e6+5;
const int MAXM=1e5+5;
const int mod=1e9+7;

int n,m,t;
int x[10],z[10],y[105][10];
LL dp[MAXN];

int main(){
    while(scanf("%d%d%d",&n,&m,&t)!=EOF){
        if (n==0 && m==0 && t==0) break;
        int sum1=0; memset(x,0,sizeof(x));
        int MX;
        for(int i=1;i<=m;i++){
            int a; scanf("%d",&a);
            sum1+=a;
            char ch;
            while(ch=getchar(),ch!='\n'){
                scanf("%d",&a); x[a]++;
                x[a]=min(x[a],2);
            }
        }
        for(int i=0;i<=1000000;i++) dp[i]=2000000000,vis[i]=0;
        int bas=1,sta=0,tag=1;
        LL ans=100000000000;
        for(int i=1;i<=n;i++){
            if (x[i]<2) tag=0;
            sta+=bas*x[i];
            bas*=3;
        }
        MX=bas;
        if (tag==1) ans=sum1;
        memset(y,0,sizeof(y));
        for(int i=1;i<=t;i++){
            scanf("%d",&y[i][0]);            
            char ch;
            while(ch=getchar(),ch!='\n'){
                int a; scanf("%d",&a);
                y[i][a]=1;
            }
        }
        dp[sta]=sum1;
        for(int i=1;i<=t;i++){
            for(int j=MX;j>=0;j--){
                if (dp[j]==2000000000) continue;
                int tmp=j,p=1;
                while(tmp!=0){
                    z[p++]=tmp%3;
                    tmp/=3;
                }
                int tag=1,sta=0,bas=1;
                for(int k=1;k<=n;k++){
                    int a=min(2,z[k]+y[i][k]);
                    if (a<2) tag=0;
                    sta+=a*bas;
                    bas*=3;                   
                }
                if (dp[sta]>dp[j]+y[i][0]){
                    dp[sta]=dp[j]+y[i][0];
                }
                if (tag==1){
                    ans=min(ans,dp[sta]);
                }
                memset(z,0,sizeof(z));
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

以上是关于c_cpp UVa 10817 - 校长的头痛的主要内容,如果未能解决你的问题,请参考以下文章

Headmaster's Headache UVa10817DP(缺)

UVA - 10817 状压DP

(状压dp)uva 10817 Headmaster's Headache

UVA - 10817 Headmaster's Headache

UVA 10817Headmaster's Headache

UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)