uva 1626 - Brackets sequence
//
// main.cpp
// uva 1626 - Brackets sequence/*这一题应该是经典的矩阵类似问题。显然 需要使用两个变量来表示最终的结果。设 dp[i][j]表示第i个位置到第j个位置变成合法形式需要添加的字符数。注意题目中的合法形式,1-->(A),2-->[A] , 3-->AB 。三种。这里 1.如果形式1或者2.则有 dp[i][j] = min(dp[i][j] , dp[i+1][j-1]) .2.如果是形式3.则有 dp[i][j] = min(dp[i][j] , dp[i][k] + dp[k+1][j]) ,其中k>=i ,k < j ;同时得注意 在递推时,如论如何都要 进入到情况2.因为即使满足形式1和2,不一定是所需添加的字母最少的情况,例如: ()([])还有就是递推的方向问题。当i== j 时 ,dp[i][i] = 1 ;注意i < j .放到矩阵里就是右上角的矩阵。再者就是 递推式。递推式要求要先求出同一行的前面的值,还用同一列下面的值。所以地推方向可以为 i从 n --> 0 ;j从0-->n.*/#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;int d[110][110] ;
char s[110] ;
int match(char c1 , char c2)
{if ((c1 == '('&&c2 == ')')||(c1 == '[' && c2 == ']' )) {return 1 ;}return 0 ;
}
int min(int a, int b )
{return a > b ? b:a ;
}
void dp(int n)
{for (int i = 0; i < n ; i++) {d[i+1][i] = 0;d[i][i] = 1 ;}for(int i = n -2 ; i > -1;i--){for (int j = i+1; j < n ; j++) {d[i][j] = n ;if(match(s[i],s[j])) d[i][j] = min(d[i][j] , d[i+1][j-1]) ;for (int k = i ; k < j ; k++) {d[i][j] = min(d[i][j] , d[i][k] + d[k+1][j]) ;}}}
}
void print(int i , int j )
{if (i >j ) {return ;}if (i == j ) {if(s[i] == '('||s[i] ==')'){printf("()") ;}else{printf("[]") ;}return ;}if (match(s[i], s[j])) {if (d[i][j] == d[i+1][j-1]) {printf("%c" ,s[i]) ; print(i+1, j-1) ;printf("%c" , s[j]) ;return ;}}for (int t = i; t< j ; t++) {if (d[i][j] == d[i][t] + d[t+1][j]) {print(i, t) ; print(t+1, j) ;return ;}}
}
int main(int argc, const char * argv[]) {int T ; scanf("%d" ,&T) ;getchar() ;for (int i = 0; i < T; i++) {
// if (i!=0) {
// printf("\n") ;
// }getchar() ;gets(s) ;int len = (int) strlen(s) ;dp(len) ;print(0, len-1) ;printf("\n") ;if(i < T-1){printf("\n") ;}}return 0;
}
uva 1626 - Brackets sequence相关推荐
- UVA - 1626 Brackets sequence
题目链接 给你一个括号序列,输出一个前后括号都匹配的补全序列,且补的字符尽量少. 对一个串s来说,只会有两种情况:1.(t)或[t]转移到t 2.有两个字符,分段转移.为了保证是最小值,一定要考虑情况 ...
- 紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp
题目链接: https://vjudge.net/problem/UVA-1626 题意: 题解: dp[i][j]:= i~j需要最少的括号 区间dp: dp[i][j] = min(dp[i][j ...
- uva 1626——Brackets sequence
题意:定义满足 1.空序列 2.()(X)及括号和其括起来的合法序列 3.[]要求和()相同 都是合法的串. 然后给定一段序列,求添加最小的()或[]使得序列合法. 思路: 区间dp.以前做过用堆栈来 ...
- uva 1626 Brackets sequence
// // main.cpp // Richard // // Created by 邵金杰 on 16/7/1. // Copyright © 2016年 邵金杰. All rights reser ...
- UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)
整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...
- COJ-1271 Brackets Sequence
斌牛出的校赛题 1271: Brackets Sequence Time Limit: 1 Sec Memory Limit: 128 MB Submit: 92 Solved: 36 [Subm ...
- UVA1626 / ZOJ1463 Brackets sequence 区间DP
简单区间DP (有空串... ...) Brackets sequence Time Limit: 4500MS Memory Limit: Unknown 64bit IO Format: ...
- POJ 1141 Brackets Sequence(动态规划)
题目大意 给你一个括号串(包括'(',')','[',']'),长度不超过 100,问你怎么添加最少的括号,使得这个括号串是合法的,输出添加括号后的合法括号串 做法分析 以长度划分阶段,定义状态:f[ ...
- UVa 1626 (输出方案) Brackets sequence
正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...
最新文章
- wingide的使用方法积累
- android 手机号分段_android 手机号分段_android系统实现手机号添加分割符
- XAML实例教程系列 – 对象和属性
- sql查询百分之20到百分之40的数据_数据库基础学习——SQL语言知识总结(6)
- 文件磁盘相关函数[9]-获取当前文件夹 GetCurrentDir
- mac地址修改_如何修改手机MAC地址?
- 他患“不死癌症” 坐轮椅考上清华并获特等奖学金
- oracle 的 dml,Oracle——DML
- Dijkstra求最短路 II
- 可可托海将打造研学旅游基地促经济发展
- 机载激光雷达原理与应用科普(二)
- i.MX6ULL驱动开发 | 10 - 修改LCD驱动点亮LCD显示小企鹅logo
- 无线ap 热图测试软件,无线AP功能测试
- Django创建超级管理员用户步骤
- 二值化神经网络——BNN
- Deepsort工作原理分析
- python提取excel指定关键词的行数据
- windows不安装虚拟机如何使用Linux系统作为开发工具?
- 【统计学】【2015.09】基于状态空间模型的时间序列预测与插值
- python----scatter绘画散点图