当前位置:   article > 正文

全组合—动态规划_动态规划的所有组合

动态规划的所有组合

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using namespace std;
  5. vector<string> result;
  6. int hashtable[26]={0};
  7. bool flag=false;
  8. int main()
  9. {
  10. string a;
  11. cin>>a;
  12. int len=a.length();
  13. int i;
  14. for(i=0;i<len;i++)
  15. {
  16. int count=result.size();
  17. int k;
  18. int index=a[i]-'a';
  19. for(k=0;k<count;k++)
  20. {
  21. if(hashtable[index]==0)
  22. {
  23. string temp=result[k]+a[i];
  24. result.push_back(temp);
  25. }
  26. else
  27. {
  28. string temp=result[k];
  29. int j;
  30. int count=0;
  31. for(j=0;j<temp.length();j++)
  32. {
  33. if(temp[j]==a[i])
  34. count++;
  35. }
  36. if(count==hashtable[index])
  37. {
  38. flag=true;
  39. string temp=result[k]+a[i];
  40. result.push_back(temp);
  41. }
  42. }
  43. }
  44. hashtable[index]++;
  45. if(!flag)
  46. {
  47. string b(1,a[i]);
  48. result.push_back(b);
  49. flag=false;
  50. }
  51. }
  52. vector<string>::iterator p= result.begin();
  53. for(p;p!=result.end();p++)
  54. cout<<*p<<endl;
  55. return 0;
  56. }

全组合的意思: 比如输入三个字母 A , B, C。 则把它们可能的组合全部打印出来: A, B, C, AB, AC, BC, ABC。 

策略:

      使用动态规划。逐个字母地访问。用一个vector<string> 保存到目前为止可能的组合。比如对于A,B, C 输入序列。动态规划的结果是

1. A

2. A,   AB,  B

3. A,   AB,  B,  AC,  ABC,  BC, C

通过模拟,我们应该能发现,若输入序列为ABCC(即输入序列中含有相同的字母,则这种方法会答应出重复的组合)。采取的方法是:建立一个hash表,记录输入序列中每个单词出现的次数。比如对于第二个C,此时C出现的次数已经为1.则只需添加动态规划中含有C一次的那些组合。

1. A
2. A,   AB,  B
3. A,   AB,  B,  AC,  ABC,  BC, C

4. A,   AB,  B,  AC,  ABC,  BC, C, ACC, ABCC, BCC, CC

参考代码:



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

闽ICP备14008679号