本文主要是介绍poj 1141 Brackets Sequence(区间DP,求最小,输出路径,较难),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、http://poj.org/problem?id=1141
2、题目大意
给出一个字符串,只包含()[]四种符号,添加最少的符号使得该字符串有序,跟前面做的括号的问题类似,上次是求字符串中有规律的子串的最长长度,这次是求最少添加多少字符使得有序,并且输出最终有序的字符串来
dp[i][j]表示i到j区间内字符有序添加的最小值,
if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]
else
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])
3、AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 105
char s[N];
int dp[N][N];
int v[N][N];
int check(char a,char b)
{if(a=='(' && b==')')return 1;if(a=='[' && b==']')return 1;return 0;
}
void output(int l,int r)
{if(l>r)return ;if(l==r){if(s[l]=='(' || s[l]==')')printf("()");elseprintf("[]");return ;}if(v[l][r]==-1){printf("%c",s[l]);output(l+1,r-1);printf("%c",s[r]);return ;}output(l,v[l][r]);output(v[l][r]+1,r);
}
int main()
{//while(scanf("%s",s)!=EOF)//{//while多次输入wrong answerscanf("%s",s);int len=strlen(s);memset(dp,-1,sizeof(dp));memset(v,-1,sizeof(v));for(int i=0; i<len; i++){dp[i][i]=1;dp[i+1][i]=0;}for(int i=1; i<len; i++){for(int j=0; j+i<len; j++){int e=j+i;if(check(s[j],s[e]))dp[j][e]=dp[j+1][e-1];for(int k=j; k<e; k++){if(dp[j][e]>dp[j][k]+dp[k+1][e] || dp[j][e]==-1){v[j][e]=k;dp[j][e]=dp[j][k]+dp[k+1][e];}}}}output(0,len-1);printf("\n");//}return 0;
}
4、题目:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 23444 | Accepted: 6595 | Special Judge |
Description
1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.
For example, all of the following sequences of characters are regular brackets sequences:
(), [], (()), ([]), ()[], ()[()]
And all of the following character sequences are not:
(, [, ), )(, ([)], ([(]
Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.
Input
Output
Sample Input
([(]
Sample Output
()[()]
Source
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 23444 | Accepted: 6595 | Special Judge |
Description
1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.
For example, all of the following sequences of characters are regular brackets sequences:
(), [], (()), ([]), ()[], ()[()]
And all of the following character sequences are not:
(, [, ), )(, ([)], ([(]
Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.
Input
Output
Sample Input
([(]
Sample Output
()[()]
Source
这篇关于poj 1141 Brackets Sequence(区间DP,求最小,输出路径,较难)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!