URAL 1183 Brackets Sequence 记忆化搜索 + DFS
2014-02-26 20:56
141 查看
这个烂题是昨天这个点开始看的. . . . . .然后卡到现在。
第一次做需要记录路径的题。大体可以想到是在记忆化搜索的回溯阶段确定那两个括号可以匹配,可就是写不出来啊。然后去问尚神怎么实现的(自从虎哥和崔老师走了之后,貌似只有尚神一个人可以问了. . . .),尚神说跟我的状态转移方程不一样。不过说了一下记录路径的思路,大体上还是差不多的。
寻找路径的两种方法,一种是在回溯过程中记录,另一种就是根据 dp[][]的值和状态转移方程从头找一遍。
第二种可能是因为又额外的DFS了一次效率要低好多。
状态转移方程:
dp[ l ][ r ]存储的位从 l 到 r 这一段最多能匹配的对数。
if(Is_Match( s[l], s[r] ) )
dp[ l ][ r ] = max(dp[ l+1 ][ i ] + dp[ i+1 ][ j ] + dp[ j+1 ][ r -1] +1 );
else
dp[ l ][ r ] = max(dp[ l ][ i ] + dp[ i+1 ][ j ] +dp[ j+1 ][ r ]);
第一次做需要记录路径的题。大体可以想到是在记忆化搜索的回溯阶段确定那两个括号可以匹配,可就是写不出来啊。然后去问尚神怎么实现的(自从虎哥和崔老师走了之后,貌似只有尚神一个人可以问了. . . .),尚神说跟我的状态转移方程不一样。不过说了一下记录路径的思路,大体上还是差不多的。
寻找路径的两种方法,一种是在回溯过程中记录,另一种就是根据 dp[][]的值和状态转移方程从头找一遍。
第二种可能是因为又额外的DFS了一次效率要低好多。
状态转移方程:
dp[ l ][ r ]存储的位从 l 到 r 这一段最多能匹配的对数。
if(Is_Match( s[l], s[r] ) )
dp[ l ][ r ] = max(dp[ l+1 ][ i ] + dp[ i+1 ][ j ] + dp[ j+1 ][ r -1] +1 );
else
dp[ l ][ r ] = max(dp[ l ][ i ] + dp[ i+1 ][ j ] +dp[ j+1 ][ r ]);
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <stack> #pragma comment(linker, "/STACK:1024000000"); #define LL long long int #define ULL unsigned long long int #define _LL __int64 #define INF 0x3f3f3f3f #define Mod 1000000009 using namespace std; char s[110]; int dp[110][110]; bool mark[110]; bool Is_Match(char a,char b) { return ( (a == '(' && b == ')') || (a == '[' && b == ']') ); } int dfs(int l,int r) { if(dp[l][r] != -1) return dp[l][r]; if(l >= r) { dp[l][r] = 0; return 0; } if(r-l == 1) { if(Is_Match(s[l],s[r])) { dp[l][r] = 1; } else dp[l][r] = 0; return dp[l][r]; } int i,j; for(i = l;i <= r; ++i) { for(j = i;j <= r; ++j) { if(Is_Match(s[i],s[j])) { dp[l][r] = max(dp[l][r],dfs(l,i-1)+dfs(i+1,j-1)+dfs(j+1,r)+1); } else { dp[l][r] = max(dp[l][r],dfs(l,i)+dfs(i+1,j)+dfs(j+1,r)); } } } return dp[l][r]; } void Match_Bra(int l,int r) { if(dp[l][r] <= 0) return ; int i,j,k; if(dp[l][r] == 1) { for(i = l; i <= r; ++i) { for(j = i+1;j <= r; ++j) { if(Is_Match(s[i],s[j])) { mark[i] = mark[j] = true; return ; } } } } while(l < r) { for(k = l+1;k < r;++k) { if(dp[l][k] + dp[k+1][r] == dp[l][r]) { Match_Bra(l,k); Match_Bra(k+1,r); return ; } } for(i = l;i <= r && dp[i][r] == dp[i+1][r]; ++i) ; for(j = r;j >= l && dp[l][j] == dp[l][j-1]; --j) ; mark[i] = mark[j] = true; l = i+1; r = j-1; } } int main() { scanf("%s",s+1); int i,j,n = strlen(s+1); memset(dp,-1,sizeof(dp)); memset(mark,false,sizeof(mark)); dfs(1,n); Match_Bra(1,n); for(i = 1;i <= n; ++i) { if(mark[i]) { printf("%c",s[i]); } else { if(s[i] == '(' || s[i] == ')') printf("()"); else printf("[]"); } } puts(""); return 0; }
相关文章推荐
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
- URAL 1183.Brackets Sequence ( DP+记录路径)
- 【算法设计与数据结构】URAL 1183.Brackets Sequence(区间dp求解)
- URAL 1183
- 【URAL 1183】Brackets Sequence(区间DP+路径记录)
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
- URAL1183——DFS+回溯—— Brackets Sequence
- URAL 1183 Brackets Sequence(DP)
- URAL 1183 Brackets Sequence DP 路径输出
- [最小极差生成树 LCT || 二分答案 CDQ分治 并查集] Ural 2055 Urban Geography
- URAL - 1486 Equal Squares 哈希、二维hash、二分、卡大素数
- URAL 2067 水dp
- URAL 2070 Interesting Numbers(数学)
- URAL1991 The battle near the swamp
- URAL 1297 Palindrome <后缀数组+RMQ>
- K - Log Files URAL - 2073
- Ural 2018The Debut Album(DP)
- URAL/1033 迷宫
- URAL - 2021 Scarily interesting!(贪心)