通过动态编程平衡排列括号
Balance ordering parenthesis via Dynamic programing
大家好,在非常著名的《破解代码》一书中,我遇到了一个问题:
实现一种算法,打印n对括号的所有有效(例如,正确打开和关闭)组合。
示例:
input: 3 (e.g., 3 pairs of parentheses)
output: ()()(), ()(()), (())(), ((()))
#include <iostream>
#include <string>
using namespace std;
void _paren(int l,int r,string s,int count);
void paren(int n)
{
string s="";
_paren(n,n,s,n);
}
void _paren(int l,int r,string s,int count){
if(l<0 || r<0)
return;
if(l==0 && r==0)
cout<<s<<endl;
else{
if(l>0)
{
_paren(l-1,r,s+"(",count+1);
}
if(r>l)
_paren(l,r-1,s+")",count+1);
}
}
int main(){
int n;
cin>>n;
paren(n);
return 0;
}
这是我尝试过的递归方法。我非常确信我们也可以通过动态编程来解决这个问题,因为我们已经一次又一次地使用了很多值,但我不知道如何通过动态编程实现这一点。我尝试了表格自下而上的方法,但没有成功。请帮我了解如何使用的基本想法
DP并不能真正帮助您。递归算法是时间和空间最优的!
事实上,不使用DP是有原因的:内存需求!这将是巨大的。
一个更好的算法是有一个传入的字符数组,让递归方法修改其中的一部分,并在需要时打印出来。我相信你提到的书中已经给出了解决方案。
DP可以通过每次调用选择最佳解决方案来减少遍历状态的数量。它还可以帮助您重用计算值。没有计算,必须访问每个有效状态,并且可以通过if()避免无效状态。
我建议您实现另一个递归(至少在调用后不复制新的字符串对象,只需声明全局char数组并在需要时将其发送到输出)。
我对递归的想法是
char arr[maxN]; int n; // n is string length, must be even though
void func(int pos, int count) { // position in string, count of opened '('
if( pos == n ) {
for(int i = 0; i < n; i++)
cout << char(arr[i]);
cout << "n";
return;
}
if( n-pos-1 > count ) {
arr[pos] = '('; func(pos+1,count+1);
}
if( count > 0 ) {
arr[pos] = ')'; func(pos+1,count-1);
}
}
我没有检查,但我想这个想法很清楚。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 重新排列单线以形成闭合多边形?
- 堆栈问题(平衡表达式问题集)
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 输入的 C++ 排列
- 公共/私有/受保护是否会更改内存中结构的排列?
- 如何在 C/C++ 中生成具有 n 组 5 个值(重复项)的所有可能排列的矩阵
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 在向量C++中排列奇数和偶数
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 如何进行排列?
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 在 CPP 中打印具有重复项的选定长度字符的所有排列
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 通过动态编程平衡排列括号