ZOJ 1639 Hang Up the System

举报
Linux猿 发表于 2021/08/05 00:39:05 2021/08/05
【摘要】 题目链接~~> 做题感悟:这题其实用深搜+状态压缩也可以,说不定更快。 解题思路:                 把不可以同时运行,的位于一组中的压缩成二进制这样标记一下(表示不可以计算价值),然后枚举每一种状态如果不合法就标记一下,最后在枚举一下每一种状态,记录合法状态的最优解。 ...

题目链接~~>

做题感悟:这题其实用深搜+状态压缩也可以,说不定更快。

解题思路:

                把不可以同时运行,的位于一组中的压缩成二进制这样标记一下(表示不可以计算价值),然后枚举每一种状态如果不合法就标记一下,最后在枚举一下每一种状态,记录合法状态的最优解。

代码:


  
  1. #include<stdio.h>
  2. #include<map>
  3. #include<queue>
  4. #include<cmath>
  5. #include<string.h>
  6. #include<iostream>
  7. #include<iomanip>
  8. #include<algorithm>
  9. #include<stdlib.h>
  10. #define INT unsigned long long int
  11. using namespace std ;
  12. const int MY = 100 + 10 ;
  13. const int MX = 2000 + 10 ;
  14. int n,mx ;
  15. int w[MX] ;
  16. bool vis[1<<16] ;
  17. map<string,int>m ;
  18. void solve(char *s1,int num)// 分解字符串
  19. {
  20. string sx="" ;
  21. int key=0 ;
  22. int len=strlen(s1),st=0,ed ;
  23. for(int i=0 ;i<len ;i++)
  24. {
  25. if(s1[i]==' '||i==len-1)
  26. {
  27. sx="" ;
  28. if(i==len-1) ed=len ;
  29. else ed=i ;
  30. for(int j=st ;j<ed ;j++)
  31. sx+=s1[j] ;
  32. key=key|(1<<m[sx]) ;
  33. st=i+1 ;
  34. }
  35. }
  36. vis[key]=true ;
  37. }
  38. void DP()
  39. {
  40. int best=0 ;
  41. for(int S=0 ;S<(1<<n) ;S++) // 枚举每一种状态标记不合法状态
  42. for(int i=0 ;i<n ;i++)
  43. if((S&(1<<i))&&vis[S^(1<<i)])
  44. {
  45. vis[S]=true ;
  46. break ;
  47. }
  48. for(int S=0 ;S<(1<<n) ;S++) // 取合法状态记录最优解
  49. {
  50. if(vis[S]) continue ;
  51. int ans=0 ;
  52. for(int i=0 ;i<n ;i++)
  53. if(S&(1<<i))
  54. ans+=w[i] ;
  55. best = max(ans,best) ;
  56. }
  57. cout<<best<<endl ;
  58. }
  59. void input()
  60. {
  61. string s="" ;
  62. char s1[MX] ;
  63. m.clear() ;
  64. memset(vis,false,sizeof(vis)) ;
  65. for(int i=0 ;i<n ;i++)
  66. {
  67. cin>>s>>w[i] ;
  68. m[s]=i ;
  69. }
  70. scanf("%d",&mx) ;
  71. getchar() ;
  72. for(int i=0 ;i<mx ;i++)
  73. {
  74. gets(s1) ;
  75. solve(s1,i) ;
  76. }
  77. }
  78. int main()
  79. {
  80. int cse=1 ;
  81. while(cin>>n,n)
  82. {
  83. input() ;
  84. cout<<"System "<<cse++<<": " ;
  85. DP() ;
  86. }
  87. return 0 ;
  88. }


文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/38350497

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。