经典问题之合法括号序列
2016-11-11 11:56
274 查看
题目描述:
给出n,表示在2*n个空位上填(或),使得整个序列是合法的。问总共有多少种方案。
分析:
显然裸裸的搜索是可以的,但是效率比较低。
如果我们定义状态f[i][j],表示前i个空位,还需j个)就是合法序列的方案数。那么就很简单了,f[i][j]=f[i-1][j-1]+f[i-1][j+1]。
参考程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110;
long long f[maxn][maxn];
bool a[maxn];
int n,m;
int main(){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for (int i=0;i<m;i++){
int x;
scanf("%d",&x);
a[x]=1;
}
f[0][0]=1;
for (int i=1;i<=2*n;i++)
for (int j=0;j<=n;j++)
if (a[i]){if (!j)f[i][j]+=f[i-1][j-1];}
else{
if (j)f[i][j]+=f[i-1][j-1];
if (j<n)f[i][j]+=f[i-1][j+1];
}
printf("%lld",f[2*n][0]);
return 0;
}这里a表示这个地方是否限制必须填(。
给出n,表示在2*n个空位上填(或),使得整个序列是合法的。问总共有多少种方案。
分析:
显然裸裸的搜索是可以的,但是效率比较低。
如果我们定义状态f[i][j],表示前i个空位,还需j个)就是合法序列的方案数。那么就很简单了,f[i][j]=f[i-1][j-1]+f[i-1][j+1]。
参考程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110;
long long f[maxn][maxn];
bool a[maxn];
int n,m;
int main(){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for (int i=0;i<m;i++){
int x;
scanf("%d",&x);
a[x]=1;
}
f[0][0]=1;
for (int i=1;i<=2*n;i++)
for (int j=0;j<=n;j++)
if (a[i]){if (!j)f[i][j]+=f[i-1][j-1];}
else{
if (j)f[i][j]+=f[i-1][j-1];
if (j<n)f[i][j]+=f[i-1][j+1];
}
printf("%lld",f[2*n][0]);
return 0;
}这里a表示这个地方是否限制必须填(。
相关文章推荐
- 九度笔记之 1342:寻找最长合法括号序列II(25分)-给括号当红娘,解决最长合法字符串问题
- 求一个数组的最长递增子序列(动态规划经典问题)
- 九度 1342 寻找最长合法括号序列II
- 括号,卡特蓝数,所有合法序列小米面试
- 【LeetCode题目记录-12】所有合法的括号序列
- [Jobdu] 题目1337:寻找最长合法括号序列
- 括号序列问题
- 经典贪心法:时间序列问题及其全局最优性证明
- 20.Valid Parentheses&合法括号序列判断
- poj 2955 Brackets(区间DP,经典问题)求有规律的括号的最大长度
- 栈的经典问题:括号配对
- 【编程学习】最大子序列和问题-经典-online线性算法
- 九度笔记之 1337:寻找最长合法括号序列
- 打印所有合法的括号序列
- 经典动态规划问题--最长上升子序列 POJ--2533
- 【九度】题目1337:寻找最长合法括号序列
- 九度 1337 寻找最长合法括号序列
- 经典的括号匹配问题
- 面试题之括号匹配分析( 出栈序列是否合法,给定一个入栈序列,求所有可能的出栈序列等等)
- 连续子序列最大和问题的四种经典解答