当前位置:   article > 正文

acm专题学习之动态规划(一)状压dp+记忆化搜索+uva 10651 - Pebble Solitaire_acm 旅行商问题 记忆化搜索

acm 旅行商问题 记忆化搜索

题目:由‘o'或’-‘组成的12格子棋盘,有两个规则:’-oo'可以变成’o--',’oo-'可以变成’--o'。问通过这两个规则最少可以只剩多少个‘o'。

状态压缩dp:带入二进制。比如说这道题里,每个格子有两种情况,那么12个格子最多有2的12次方种情况。每个格子里面‘o'对应为1,’-‘对应为0,那么组成的情况就可以用12个格子组成的2进制数表示。例如’-oo-oo-oo-oo'为'011011011011'的二进制数。

记忆化搜索(数位dp):dfs搜索(枚举吧)+记忆化数组,跟之前我写的那篇数位dp,我觉得是一个方法来着。

代码:

  1. #include <algorithm>
  2. #include <string>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <cmath>
  7. using namespace std;
  8. const int inf = 0x3f3f3f3f;
  9. const int maxn=1<<12+5;//状态压缩后最多的状态数,保险加个5
  10. char s[15];
  11. int num[15];
  12. int dp[maxn];//记忆化数组,dp数组记录的情况对应最大删除o的数量
  13. int dfs(int x)//dfs,x表示状态
  14. {
  15. //printf("%d\n",dp[x]);
  16. if(dp[x]!=-1)//已经算过了,就直接返回
  17. return dp[x];
  18. dp[x]=0;
  19. for(int i=0;i<10;i++)
  20. {
  21. if(num[i]==0&&num[i+1]==1&&num[i+2]==1)
  22. {
  23. num[i]=1;
  24. num[i+1]=0;
  25. num[i+2]=0;
  26. dp[x]=max(dp[x],dfs(x^(1<<(i+2)^(1<<i)^(1<<(i+1))))+1);
  27. num[i]=0;
  28. num[i+1]=1;
  29. num[i+2]=1;
  30. }
  31. else if(num[i]==1&&num[i+1]==1&&num[i+2]==0)
  32. {
  33. num[i]=0;
  34. num[i+1]=0;
  35. num[i+2]=1;
  36. dp[x]=max(dp[x],dfs(x^(1<<(i+2)^(1<<i)^(1<<(i+1))))+1);
  37. num[i]=1;
  38. num[i+1]=1;
  39. num[i+2]=0;
  40. }
  41. }
  42. return dp[x];
  43. }
  44. int main()
  45. {
  46. int t;
  47. scanf("%d",&t);
  48. while(t--)
  49. {
  50. //printf("%d\n",maxn);
  51. for(int i=0;i<maxn;i++)
  52. {
  53. dp[i]=-1;
  54. }
  55. scanf("%s",s);
  56. int sum=0;
  57. int cnt=0;
  58. for(int i=0;s[i]!='\0';i++)
  59. {
  60. if(s[i]=='o')
  61. {
  62. num[i]=1;
  63. sum++;
  64. cnt^=1<<(i);
  65. }
  66. else
  67. {
  68. num[i]=0;
  69. }
  70. }
  71. //printf("%d\n",dp[cnt]);
  72. printf("%d\n",sum-dfs(cnt));
  73. }
  74. return 0;
  75. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/1002105
推荐阅读
相关标签
  

闽ICP备14008679号