NYOJ 题目15 括号匹配(二)(区间DP)
2014-04-11 21:01
375 查看
点我看题目
题意 : 中文题不详述。
思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解。
DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配。
所以初始化的DP[i][i] = 1 ;第i个位置的话需要匹配的最小括号数是1。
状态转移方程 :如果第i个位置和第j个位置的两个括号是匹配的,那么DP[i][j] = DP[i+1][j-1],相当于两边分别往里缩了一个;当i < j 时,DP[i][j] = DP[i][k]+DP[k+1][j] ;
黑书上对于这个问题有详细的解释。我用的就是黑书上的方法二,不过方法二有点赘余,就是我代码中注释的部分,加上也对,不加也可。
View Code
题意 : 中文题不详述。
思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解。
DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配。
所以初始化的DP[i][i] = 1 ;第i个位置的话需要匹配的最小括号数是1。
状态转移方程 :如果第i个位置和第j个位置的两个括号是匹配的,那么DP[i][j] = DP[i+1][j-1],相当于两边分别往里缩了一个;当i < j 时,DP[i][j] = DP[i][k]+DP[k+1][j] ;
黑书上对于这个问题有详细的解释。我用的就是黑书上的方法二,不过方法二有点赘余,就是我代码中注释的部分,加上也对,不加也可。
#include <stdio.h> #include <string.h> #include <iostream> using namespace std ; int dp[210][210] ; char ch[123] ; int main() { int n ; scanf("%d",&n) ; getchar() ; while(n--) { scanf("%s",ch); memset(dp,0,sizeof(dp)) ; int len = strlen(ch) ; for(int i = 0 ; i < len ; i++) dp[i][i] = 1 ; for(int h = 1 ; h < len ; h++) { for(int i = 0 ; i < len-h ; i++) { int j = h+i ; dp[i][j] = 99999999 ; if((ch[i] == '('&&ch[j] == ')') || (ch[i] == '[' && ch[j] == ']')) dp[i][j] = min(dp[i][j],dp[i+1][j-1]) ; // else if(ch[i] == '(' || ch[i] == '[') // dp[i][j] = min(dp[i][j],dp[i+1][j])+1 ; // else if(ch[j] == ')' || ch[j] == ']') // dp[i][j] = min(dp[i][j],dp[i][j-1])+1 ; for(int k = i ; k <= j ; k++) dp[i][j] = min(dp[i][j],dp[i][k-1]+dp[k][j]) ; } } printf("%d\n",dp[0][len-1] ) ; } return 0 ; }
View Code
相关文章推荐
- 移动开发:怎么去掉点击时出现背景蓝色?
- MARK 测试工具
- web前端学习之路(一)
- 【介绍两款SSH爆破工具 hydra+medusa】
- poj 3253 Fence Repair (哈夫曼)
- 模版的完全特化与偏特化
- SDOI2014 Round1 day0
- big endian and little endian
- c#如何读取txt文件内容
- codec engine example各文件夹及包中各文件解析
- OC内存管理总结一:
- 重构(Refactor)的意义
- 密码学 week1
- cvConvertScale,cvConvert , cvScale
- errno多线程安全
- codec engine代码阅读七---codecs中的xDM,XDAIS函数解析
- Android-UI学习之Spinners的用法
- C#模拟鼠标键盘控制其他窗口
- cookie转coontoin
- C 中 static 的应用