POJ 1141 Brackets Sequence ( 区间DP )
来源:互联网 发布:asp.net core php 编辑:程序博客网 时间:2024/04/30 06:02
题意:给一组小括号与中括号的序列,添加最少的字符,使该序列变为合法序列,输出该合法序列。
分析:设dp[i,j]为从位置i到位置j需要加入字符的最小次数,有dp[i,j]=min(dp[i,k]+dp[k+1,j]),其中i<=k<j。特别的当s[i]='[' s[j]=']'或者s[i]='(' s[j]=')'时,dp[i,j]=dp[i+1,j-1]。初始条件为dp[i,i]=1,其中0<=i<len。
//256K16MS#include <cstdio>#include <iostream>#include <cstring>#include <climits>#define N 110using namespace std ;char str[N] ;int dp[N][N] ; //dp[i][j]表示从位置i到位置j学要加入字符的最小次数int path[N][N] ; //记录输出相关路径voidOutput ( int const start , int const end ){ if ( start > end ) { return ; } else if ( start == end ) { if ( '[' == str[start] || ']' == str[start] ) { printf ("[]") ; } else { printf ("()") ; } } else if ( -1 == path[start][end] ) { printf ("%c" , str[start] ) ; Output ( start + 1 , end - 1 ) ; printf ("%c" , str[end] ) ; } else { Output ( start , path[start][end] ) ; Output ( path[start][end] + 1 , end ) ; }}voidResart_DP ( ){ for ( int i = 0 ; i < N ; i ++ ) { for ( int j = 0 ; j < N ; j ++ ) { dp[i][j] = 0 ; } }}voidSet_DP ( int const n ){ for ( int i = 0 ; i < n ; i ++ ) { dp[i][i] = 1 ; //初始化时dp[i][i] = 1 }}voidSolve ( ){ int n ; //n代表字符串长度 n = strlen ( str ) ; Resart_DP ( ) ; //初始化相关信息 Set_DP ( n ) ; for ( int r = 1 ; r < n ; r ++ ) { for ( int i = 0 ; i < n - r ; i ++ ) { int j ; j = i + r ; dp[i][j] = INT_MAX ; 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] ; path[i][j] = -1 ; } } for ( int k = i ; k < j ; k ++ ) { if ( dp[i][j] > dp[i][k] + dp[k+1][j] ) { dp[i][j] = dp[i][k] + dp[k+1][j] ; path[i][j] = k ; } } } } Output ( 0 , n - 1 ) ; printf ("\n") ; return ;}intmain ( ){ while ( gets(str ) ) { Solve ( ) ; } return 0 ;}
- POJ 1141 Brackets Sequence(区间DP)
- poj 1141Brackets Sequence[区间dp]
- POJ 1141 Brackets Sequence ( 区间DP )
- POJ 1141 - Brackets Sequence 区间DP
- POJ-1141 Brackets Sequence 经典区间DP
- POJ 1141 Brackets Sequence 区间dp
- POJ 1141 Brackets Sequence (区间DP)
- poj 1141 Brackets Sequence (区间DP)
- poj 1141 Brackets Sequence(区间dp)
- poj 1141 Brackets Sequence(区间dp)
- POJ 1141 Brackets Sequence (区间DP)
- POJ 1141 - Brackets Sequence(区间DP)
- poj 1141 Brackets Sequence(区间dp)
- POJ 1141 Brackets Sequence(区间DP)
- poj 1141 Brackets Sequence 区间dp入门
- poj 1141 Brackets Sequence(区间dp)
- POJ 1141 Brackets Sequence 区间dp
- POJ 1141 Brackets Sequence(区间DP)
- Andriod Support V4 V7 V13的应用场景
- 计算机网络应用层协议分类
- 淘宝开店经验 心得 攻略
- Exception in thread "main" java.lang.StackOverflowError
- char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集
- POJ 1141 Brackets Sequence ( 区间DP )
- fedora18 startx如何显示中文界面及文本模式和窗口模式切换
- Android 笔记(待续,不断更新)
- Jeecms项目遇到问题集
- oracle 程序包基础之基础
- 小明系列故事——买年货
- 处世悬镜之舍之 三
- printf()函数相关
- automake 与 NDK 交叉编译