URAL 1183 Brackets Sequence(DP)

题目链接

题意 : 给你一串由括号组成的串,让你添加最少的括号使该串匹配。

思路 : 黑书上的DP。dp[i][j] = min{dp[i+1][j-1] (sh[i] == sh[j]),dp[i][k]+dp[k+1][j](i<=k<j)}.输出的时候递归,其实我觉得输出比dp部分难多了。。。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4
 5 using namespace std ;
 6
 7 char sh[110] ;
 8 int dp[110][110] ,mark[110][110] ;
 9 //dp数组代表的是从i到j需要添加的最少的括号是多少,mark数组代表的是从i到j在mark[i][j]这个位置添加括号可以使得添加的括号数最少
10
11 void print(int i,int j)
12 {
13     if(i > j) return  ;
14     else if(i == j)
15     {
16         if(sh[i] == ‘(‘||sh[i] == ‘)‘)
17                 printf("()") ;
18         else printf("[]") ;
19     }
20     else if(mark[i][j] == -1)
21     {
22         printf("%c",sh[i]) ;
23         print(i+1,j-1) ;
24         printf("%c",sh[j]) ;
25     }
26     else
27     {
28         print(i,mark[i][j]) ;
29         print(mark[i][j]+1,j) ;
30     }
31 }
32 int main()
33 {
34     while(gets(sh))
35     {
36         int len = strlen(sh) ;
37         memset(dp,0,sizeof(dp)) ;
38         for(int i = 0 ; i < len ; i++)
39         {
40             dp[i][i] = 1 ;
41         }
42         for(int l = 1 ; l < len ; l ++)//从小区间推出大区间,枚举长度
43         {
44             int temp = len - l ;
45             for(int i = 0 ; i < temp ; i++)
46             {
47                 int j = i + l ;
48                 dp[i][j] = 99999999 ;
49                 if((sh[i] == ‘(‘&& sh[j] == ‘)‘)|| (sh[i] == ‘[‘&&sh[j] == ‘]‘))
50                 {
51                     dp[i][j] = dp[i+1][j-1] ;
52                     mark[i][j] = -1 ;
53                 }
54                 for(int k = i ; k < j ; k++)
55                 {
56                     int temp1 = dp[i][k] + dp[k+1][j] ;
57                     if(dp[i][j] >= temp1)
58                     {
59                         dp[i][j] = temp1 ;
60                         mark[i][j] = k ;
61                     }
62                 }
63             }
64         }
65         print(0,len-1) ;
66         puts("") ;
67     }
68     return 0 ;
69 }

时间: 2024-08-08 05:20:14

URAL 1183 Brackets Sequence(DP)的相关文章

Ural 1183 Brackets Sequence(区间DP+记忆化搜索)

题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0<=i<=j<len (len为输入序列的长度). c[i][j]为输入序列从下标i到下标j的断开位置.假设没有断开则为-1. 当i==j时.d[i][j]为1 当s[i]=='(' && s[j]==')' 或者 s[i]=='[' && s[j]==']'时,d

1626 - Brackets sequence(DP)

和前面一样,要注意状态的枚举顺序,边界是d[i+1][i] = 0 和d[i][i] = 1  ,所以枚举的区间应该从小到大,大区间依赖于小区间的最优解 . 然后就是状态的转移,是如何转移的呢? d[i][j]表示字符串i~j的最优解,那么先检查i与j是否匹配,如果匹配,状态转移可以转移到d[i+1][j-1] . 无论是否匹配,状态还都能转移到子区间上:d[i][k] 和 d[k+1][j] ,这是不是就像最优矩阵链乘问题了?  只不过该题对正规括号序列的定义有一条:如果S是正规括号序列,那么

POJ1141 Brackets Sequence (dp动态规划,递归)

本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ] [ j ] 表示添加括号的个数, pos[ i][ j ] 表示 i , j 中哪个位置分开,使得两部分分别匹配. pos [ i ][ j ] 为-1的时候,说明i, j 括号匹配. 初始值置dp [ i ] [ i ]  = 1; 如果只有一个括号,那么匹配结果必然是差1. 首先判断括号是

记忆化搜索+DFS URAL 1183 Brackets Sequence

题目传送门 1 /* 2 记忆化搜索+DFS:dp[i][j] 表示第i到第j个字符,最少要加多少个括号 3 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 4 当s[x] 与 s[y] 匹配,则搜索 (x+1, y-1); 否则在x~y-1枚举找到相匹配的括号,更新最小值 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cmath> 9 #include

uva 1626 Brackets Sequence ?(动态规划)

状态表示方法:d[ i ][ j ]表示的是一条序列的开始和结束: 状态定义:d[ i ][ j ]表示字串s[ i~j ] 需要添加的数量. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n; char s[105]; int d[105][105]; bool match(char ch1,char ch2) { if((ch1=='['&&am

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

URAL 1167. Bicolored Horses (DP)

题目链接 题意 :农夫每天都会放马出去,然后晚上把马赶入马厩,于是让马排成一行入马厩,但是不想马走更多的路,所以让前p1匹入第一个马厩,p2匹马入第二个马厩…………但是他不想让他的任何一个马厩空着,所有的马都必须入马厩.有两种颜色的马,如果 i 匹黑马与 j 匹白马同在一个马厩,不愉快系数是 i * j,总系数就是k个系数相加.让总系数最小. 思路 : dp[i][j] 代表的是前 i 个马厩放 j 匹马的最小不愉快系数值. 1 //1167 2 #include <cstdio> 3 #in

[LeetCode] Longest Consecutive Sequence(DP)

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example,Given [100, 4, 200, 1, 3, 2], The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4. Your algorithm should run in

URAL 1073 Square Country(DP)

题目链接 题意 :这个人要投资地,每块地都是正方形并且边长都是整数,他希望他要买的地尽量的少碎块.每买一块地要付的钱是边长的平方,而且会得到一个一份证书,给你一个钱数,让你求出能得到的证书个数. 思路 :其实就是求x12+x22+--+Xn2中的最小的n. 1 //1073 2 #include <stdio.h> 3 #include <iostream> 4 #include <math.h> 5 6 using namespace std ; 7 8 int a[