【UVA】1626-Brackets sequence(动态规划)
2014-08-05 18:26
211 查看
一道算是比较难理解的动规。
状态转移分2个:
(用d[i][j]表示在i~j内最少需要添加几个括号,保持平衡)
1.如果s[i]和s[j]是一对括号,那么d[i][j] = d[i + 1][j - 1]
2.否则的话 d[i][j] = min(d[i][k],[k + 1][j]);
边界是d[i + 1][i] = 0; d[i][i] = 1;
状态转移分2个:
(用d[i][j]表示在i~j内最少需要添加几个括号,保持平衡)
1.如果s[i]和s[j]是一对括号,那么d[i][j] = d[i + 1][j - 1]
2.否则的话 d[i][j] = min(d[i][k],[k + 1][j]);
边界是d[i + 1][i] = 0; d[i][i] = 1;
13993644 | 1626 | Brackets sequence | Accepted | C++ | 1.109 | 2014-08-05 10:18:17 |
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<stack> #include<queue> #include<set> #include<ctime> #include<cmath> #include<string> #include<iomanip> #include<climits> #include<cctype> #include<deque> #include<list> #include<sstream> #include<vector> #include<cstdlib> using namespace std; #define _PI acos(-1.0) #define INF (1 << 20) typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> pill; /*======================================*/ #define MAXD 1000 + 10 char str[MAXD]; int dp[MAXD][MAXD];/*串i,j需要增加几个括号*/ void init(){ for(int i = 0 ; i < strlen(str) ; i++){ dp[i + 1][i] = 0; dp[i][i] = 1; } return ; } bool is_ok(int i,int j){ if(str[i] == '(' && str[j] == ')') return true; else if(str[i] == '[' && str[j] == ']') return true; else return false; } void print(int i,int j){ if(i > j) return ; if(i == j){ if(str[i] == '(' || str[i] == ')') printf("()"); else printf("[]"); } int ans = dp[i][j]; if(is_ok(i,j) && ans == dp[i + 1][j - 1]){ printf("%c",str[i]);print(i + 1, j - 1);printf("%c",str[j]); return ; } for(int k = i ; k < j ; k++){ if(ans == dp[i][k] + dp[k + 1][j]){ print(i,k);print(k + 1,j); return ; } } } void DP(){ init(); int n = strlen(str); for(int i = n - 2 ; i >= 0 ; i --){ for(int j = i + 1 ; j < n ; j++){ dp[i][j] = n; if(is_ok(i,j)){ dp[i][j] = min(dp[i][j],dp[i + 1][j - 1]); } for(int k = i ; k < j ; k++) dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j]); } } if(!dp[0][n - 1]) printf("%s",str); else print(0,n - 1); return ; } int main(){ int T; scanf("%d%*c",&T); while(T--){ if(!strlen(str)); else DP(); printf("\n"); if(T) printf("\n"); } return 0; }
相关文章推荐
- uva 1626 Brackets Sequence ❀(动态规划)
- uva 1626(动态规划起步第五天 LIS变形 括号匹配)
- UVA 1025 A Spy in the Metro [动态规划] [DAGdp]
- Brackets sequence UVA - 1626
- 【动态规划】UVa 437 The Tower of Babylon
- [动态规划]UVA 507 - Jill Rides Again
- 记忆化搜索,动态规划(巴比伦塔,uva 437)
- UVA 11584 Paritioning by Palindromes(动态规划 回文)
- 动态规划(颜色的长度,uva 1625)
- UVA 1626 区间dp、打印路径
- uva1625 Color Length 线性动态规划
- 动态规划 UVA - 562 Dividing coins
- uva 11324 The Largest Clique(图论-tarjan,动态规划)
- UVa11157 - Dynamic Frog(动态规划)
- UVA11584[Partitioning by Palindromes] 动态规划
- 【算法竞赛入门经典】动态规划初步 例题9-6 UVa11400
- 【动态规划】[UVa1625]Color Length
- UVA 1626 Brackets sequence (最优矩阵链乘)
- UVa:11404 Palindromic Subsequence(动态规划)
- Game of Sum UVA - 10891(动态规划)