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+记忆化搜索)