UVA 1626 Brackets sequence(括号匹配 + 区间DP)
2016-02-01 18:43
471 查看
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E
题意:添加最少的括号,让每个括号都能匹配并输出
分析:dp[i][j]表示第i个到第j个需要添加的最少的括号,pos[i][j] = k;表示i到j间第k个需要加括号;
如果str[i]和str[j]匹配,那么dp[i][j] = max(dp[i + 1][j - 1], dp[i][j]);
如果str[i]和str[j]不匹配,那么dp[i][j] = max(dp[i][j], dp[i][k]+dp[k + 1][j]); i<= k < j;之前想过k为什么不能等于j,
View Code
题意:添加最少的括号,让每个括号都能匹配并输出
分析:dp[i][j]表示第i个到第j个需要添加的最少的括号,pos[i][j] = k;表示i到j间第k个需要加括号;
如果str[i]和str[j]匹配,那么dp[i][j] = max(dp[i + 1][j - 1], dp[i][j]);
如果str[i]和str[j]不匹配,那么dp[i][j] = max(dp[i][j], dp[i][k]+dp[k + 1][j]); i<= k < j;之前想过k为什么不能等于j,
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int MAX = 120; const int INF = 0x3f3f3f3f; int dp[MAX][MAX],pos[MAX][MAX]; char str[MAX]; int n; void DP() { n = strlen(str); memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++) dp[i][i] = 1; for(int p = 1; p < n; p++) { for(int i = 0; i < n; i++) { int j = i + p; if(j >= n) break; dp[i][j] = INF; if( (str[i] == '(' && str[j] == ')') || ( str[i] == '[' && str[j] == ']' ) ) { if(dp[i][j] > dp[i + 1][j - 1]) dp[i][j] = dp[i + 1][j - 1]; } pos[i][j] = -1; for(int k = i; k < j; k++) { int temp = dp[i][k] + dp[k + 1][j]; if(temp < dp[i][j]) { dp[i][j] = temp; pos[i][j] = k; } } } } } void Print(int beg, int End) { if(beg > End) return; if(beg == End) { if(str[beg] == '(' || str[beg] == ')') printf("()"); if(str[beg] == '[' || str[beg] == ']') printf("[]"); } else { if(pos[beg][End] == -1) { printf("%c", str[beg]); Print(beg + 1, End - 1); printf("%c", str[End]); } else { Print(beg, pos[beg][End]); Print(pos[beg][End] + 1, End); } } } int main() { int t; scanf("%d", &t); getchar(); getchar(); for(int i = 0; i < t; i++) { gets(str); DP(); Print(0, n - 1); printf("\n"); if(i < t - 1) printf("\n"); getchar(); } return 0; }
View Code
相关文章推荐
- jfinal整合妹子UI初步完成
- iOS_第3方类库_BlurAlertView_GPUImage
- kendo-ui
- UITableView只更新高度不更新内容以及只更新内容不更新高度
- 获取Jenkins project build结果
- Android中AlertDialog, AltertDialog.Builder的基本用法与Builder模式
- UITextInput 协议参考
- 如何在easyui的DataGrid的单元格添加ProgressBar进度条
- iOS 简单的贝塞尔(UIBezierPath)曲线使用
- iOS UIPageControl使用
- Vue有坑慎入
- No DEFAULT or UI configuration directive found!
- setValuesForKeysWithDictionary forUndefinedKey
- android ui设计
- Incorrect string value: '\xE4\xBC\x9A\xE5\x91\x98' for column 'recipient' at row 1
- ThreadPoolExecutor线程池解析与BlockingQueue的三种实现
- Liferay开发实战(2):Service Builder生成持久化层,及开发服务层
- Android中View的requestLayout()与invalidate()方法的理解
- EasyUI 中GridView 满足某条件 改变行的背景色
- UIImagePickerController简单使用