首页 > 代码库 > URAL 1183 Brackets Sequence(DP)
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 else27 {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 }
URAL 1183 Brackets Sequence(DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。