uva 10817 状态压缩DP
2017-07-22 16:38
344 查看
#include<cstdio> #include<cstring> using namespace std; #define min(x,y) ((x)>(y)?(y):(x)) #define INF 0x3f3f3f3f using namespace std; int s,m,n,len,sum,cost[160]; int dp[1000][1000],d[1000],vis[160]; int solve(int str1,int str2) { int i,s1,s2; memset(dp,0x3f,sizeof(dp)); dp[str1][str2]=sum; for(i=m+1;i<=m+n;i++) for(s1=len;s1>=0;s1--) for(s2=len;s2>=0;s2--) { if(dp[s1][s2]>=INF) continue; int st1=d[i]|s1; int st2=(d[i]&s1)|s2; dp[st1][st2]=min(dp[st1][st2],dp[s1][s2]+cost[i]); } return dp[len][len]; } int main() { char str[10000]; while(~scanf("%d%d%d",&s,&m,&n)&&s) { int i,j; len=(1<<s)-1; sum=0; int str1=0,str2=0; memset(vis,0,sizeof(vis)); for(i=1;i<=m+n;i++) { scanf("%d",&cost[i]); gets(str); d[i]=0; for(j=0;j<strlen(str);j++) { if(str[j]<='9'&&str[j]>='0') { int num=str[j]-'0'; d[i]|=1<<(num-1); if(i<=m) vis[num-1]++; } } if(i<=m) { sum+=cost[i]; str1|=d[i]; } } for(i=0;i<s;i++) if(vis[i]>1) str2|=(1<<i); printf("%d\n",solve(str1,str2)); } }
相关文章推荐
- Uva 10817 Headmaster's Headache (DP+ 状态压缩)
- UVa 10817 - Headmaster's Headache (简单DP 状态压缩)
- UVA 10817-Headmaster’s Headache(状态压缩DP)
- UVA10817--状态压缩DP
- UVA 10817 Headmaster's Headache(dp 状态压缩 01背包)
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
- UVa 10817 - Headmaster's Headache ( 状态压缩dp)
- UVa 10817 Headmaster's Headache(状态压缩DP)
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
- Uva 10817 - Headmaster's Headache(状态压缩DP)
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
- uva 10817 状态压缩DP
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)
- uva 10651 Pebble Solitaire(dp,状态压缩,记忆化搜索)
- UVA 10651 Pebble Solitaire 状态压缩dp
- UVA - 11795 Mega Man's Mission 状态压缩DP
- UVA 11795 Mega Man's Mission(状态压缩DP)
- UVa 11825 黑客的攻击(状态压缩dp)
- UVA 1252 Twenty Questions 状态压缩dp 记忆化搜索
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)