FZU 2030 括号问题
2013-04-21 11:33
246 查看
用动态规划的方法
解题思路:用一个二维数组dp[][],dp[i][j]表示遍历到第i+1个字符时,有j个未匹配的‘(’的方案有多少种。
所以,当s[i]=’(‘时,当前有j个未匹配的‘(’的方案数 == 还没遍历这个字符时的j-1个未匹配的‘(’方案数。
即,dp[i][j] = dp[i-1][j-1]。
当s[i]=’)‘时,当前有j个未匹配的‘(’的方案数 == 还没遍历到这个字符的j+1个未匹配的‘(’方案数。
即,dp[i][j] = dp[i-1][j+1]。
当s[i]= '?'时,即把前两种情况都考虑进来。dp[i][j] = dp[i-1][j-1]+ dp[i-1][j+1] 。
最后输入dp[len-1][0] , 即 第 len个字符时,有0个未匹配的’(‘的方案数。。
解题思路:用一个二维数组dp[][],dp[i][j]表示遍历到第i+1个字符时,有j个未匹配的‘(’的方案有多少种。
所以,当s[i]=’(‘时,当前有j个未匹配的‘(’的方案数 == 还没遍历这个字符时的j-1个未匹配的‘(’方案数。
即,dp[i][j] = dp[i-1][j-1]。
当s[i]=’)‘时,当前有j个未匹配的‘(’的方案数 == 还没遍历到这个字符的j+1个未匹配的‘(’方案数。
即,dp[i][j] = dp[i-1][j+1]。
当s[i]= '?'时,即把前两种情况都考虑进来。dp[i][j] = dp[i-1][j-1]+ dp[i-1][j+1] 。
最后输入dp[len-1][0] , 即 第 len个字符时,有0个未匹配的’(‘的方案数。。
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int dp[20][20]; char s[20]; int main() { while(scanf(" %s",s)!=EOF) { int len = strlen(s); if(s[0]==')'){printf("0\n");continue;} memset(dp,0,sizeof(dp)); dp[0][1]=1; //初始化,一个字符时,有一个'('未匹配的方案有1种。 for(int i=1;i<len;i++) for(int j=0;j<len;j++) { //3种情况。还要考虑j-1的边界问题。 if(s[i]=='('){ if(j==0)dp[i][j]=0; else dp[i][j]=dp[i-1][j-1]; } else if(s[i]==')')dp[i][j]=dp[i-1][j+1]; else { if(j==0) dp[i][j]=dp[i-1][j+1]; else dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]; } } printf("%d\n",dp[len-1][0]); } return 0; }
相关文章推荐
- FZU---2030 括号问题[爆搜||DP]
- FZU 2030 括号问题 dfs/dp
- dp:FZU2030括号问题
- FZU Problem 2030 括号问题
- fzu 2030 括号问题(DFS)
- FZU FOJ 2030 括号问题【dp】||【暴搜+栈判断括号匹配】
- FZU 2030 括号问题 (DFS)
- FZU 2030 括号问题 (括号匹配)
- FZU 2030 括号问题
- FZU2030(括号匹配)
- 数据结构课程设计:括号匹配问题(实现检验匹配并输出不匹配的位置)
- 括号配对问题
- noi.openjudge.cn 2705括号匹配问题
- FZU 1062 洗牌问题
- 括号配对问题
- 括号配对问题
- 写c++作业时发现的问题:强制转换时最好将目标括进括号里
- 【九度】题目1153:括号匹配问题
- 用堆栈解决括号匹配问题(C语言)