全组合—动态规划
来源:互联网 发布:遥感卫星数据 云检测 编辑:程序博客网 时间:2024/05/21 18:44
#include<iostream>#include<string>#include<vector>using namespace std;vector<string> result;int hashtable[26]={0};bool flag=false;int main(){string a;cin>>a;int len=a.length();int i;for(i=0;i<len;i++){int count=result.size();int k;int index=a[i]-'a';for(k=0;k<count;k++){if(hashtable[index]==0){string temp=result[k]+a[i];result.push_back(temp);}else{string temp=result[k];int j;int count=0;for(j=0;j<temp.length();j++){if(temp[j]==a[i])count++;}if(count==hashtable[index]){flag=true;string temp=result[k]+a[i];result.push_back(temp);}}}hashtable[index]++;if(!flag){string b(1,a[i]);result.push_back(b);flag=false;}}vector<string>::iterator p= result.begin();for(p;p!=result.end();p++)cout<<*p<<endl;return 0;}
全组合的意思: 比如输入三个字母 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
参考代码:
- 全组合—动态规划
- 动态规划应用—硬币组合问题
- 动态规划—组合成指定值
- 动态规划-组合
- 动态规划:数字组合
- 动态规划全解析
- 硬币组合问题-动态规划
- 动态规划之组合求解
- BZOJ1925【动态规划】【组合数学】
- 动态规划实现组合数
- 动态规划-硬币组合数目
- 用动态规划求组合数
- Interleaving String (字符串组合,动态规划) 【leetcoode】
- 动态规划之求组合数
- 【动态规划】硬币面值组合(上台阶)
- 动态规划之硬币组合问题
- 【动态规划】最小硬币面值组合
- HDU 4832 Chess (动态规划+组合数学)
- onpropertychange 文本域改变触发事件
- LinkedIn 加速从Web向移动平台转移,全移动时代到来?
- jquery中的sortable排序之后的保存状态的解决方法
- TCP头校验和计算算法详解
- 用qt实现类似qq截图的工具
- 全组合—动态规划
- 通过linux系统宏定义,遍历系统中的进程
- 继承情况下的类作用域
- FIMD架构分析
- 交换两个数的值Swap的一些方法及其源代码实现
- 第一个Jsf程序
- TMS320F28335
- Android Service 服务(三)—— bindService与remoteService
- linux命令