题目描述
参照紫书上的思路,一开始d值初始化为0 TLE 了……
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<sstream>
using namespace std;
int s,m,n,d[125][265][265],c[140],st[140];
int dp(int i,int s0,int s1,int s2){
if(i==m+n) return s2==(1<<s)-1?0:1e9;
int& ans=d[i][s1][s2];
if(ans>=0) return ans;
ans=1e9;
if(i>=m) ans=dp(i+1,s0,s1,s2);
int m0=st[i]&s0,m1=st[i]&s1;
s0^=m0;s1=(s1^m1)|m0;s2|=m1;
ans=min(ans,dp(i+1,s0,s1,s2)+c[i]);
return ans;
}
int main(){
while(scanf("%d%d%d",&s,&m,&n)==3&&s){
string str;
getline(cin,str);
memset(st,0,sizeof(st));
memset(d,-1,sizeof(d));
for(int i=0;i<m+n;i++){
getline(cin,str);
stringstream ss(str);
ss>>c[i];
int x;
while(ss>>x) st[i]|=1<<--x;
}
cout<<dp(0,(1<<s)-1,0,0)<<endl;
}
return 0;
}