ural1183&&poj1141 Brackets Sequence(区间DP+记录路径)
2017-07-29 11:47
267 查看
黑书动规1.5.1例题1,原题多了记录路径,要递归打印出来。
dp[i][j]表示s[i…j]需加至少多少个括号才能变成合法的。
状态转移:dp[i][j]=min(dp[i][k]+dp[k+1][j])(i≤k<j)
如果s[i]和s[j]匹配了,如果i+1==j,dp[i][j]=0;
else 在dp[i+1][j-1]与dp[i][j]中取最小。
op[i][j]记录操作,0–加入另一半括号; 正数k–从k分开; -1–已匹配
循环i要从大到小,j要从小到大,因为计算dp[i][j]时会用到dp[i+k][j]和dp[i][j-k]。
dp[i][j]表示s[i…j]需加至少多少个括号才能变成合法的。
状态转移:dp[i][j]=min(dp[i][k]+dp[k+1][j])(i≤k<j)
如果s[i]和s[j]匹配了,如果i+1==j,dp[i][j]=0;
else 在dp[i+1][j-1]与dp[i][j]中取最小。
op[i][j]记录操作,0–加入另一半括号; 正数k–从k分开; -1–已匹配
循环i要从大到小,j要从小到大,因为计算dp[i][j]时会用到dp[i+k][j]和dp[i][j-k]。
#include <cstdio> #include <cstring> #define inf 2000000000 int const N=110; int dp ,op ; char s ; void print(int i,int j){ if(i>j) return;//注意判错 if(op[i][j]>0){ print(i,op[i][j]); print(op[i][j]+1,j);return; } if(!op[i][j]){ if(s[i]=='('||s[i]==')') printf("()"); else printf("[]");return; } printf("%c",s[i]); print(i+1,j-1); printf("%c",s[j]);return; } int main(){ // freopen("a.in","r",stdin); scanf("%s",s+1); int n=strlen(s+1); for(int i=n;i>=1;--i) for(int j=i;j<=n;++j){ if(i==j){ dp[i][j]=1;op[i][j]=0; continue;//0-add the one that maches } int temp=i,ans=inf; for(int k=i;k<j;++k) if(dp[i][k]+dp[k+1][j]<ans) ans=dp[i][k]+dp[k+1][j],temp=k; dp[i][j]=ans;op[i][j]=temp;//positive value--split at op[i][j] if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']'){ if(i+1==j) dp[i][j]=0,op[i][j]=-1;//-1--mached else if(dp[i+1][j-1]<dp[i][j]) dp[i][j]=dp[i+1][j-1],op[i][j]=-1; } } print(1,n);printf("\n"); return 0; }
相关文章推荐
- poj1141(区间dp+记录路径)
- POJ1141 Brackets Sequence (最小括号匹配升级版:区间DP+打印路径)
- poj 1141 Brackets Sequence 【区间DP+路径记录】
- 【URAL 1635】Mnemonics and Palindromes(区间DP+记录路径)
- poj1141 Brackets Sequence(区间dp记录路径问题)
- (常复习)poj 1015 dp+记录dp路径+转变最优子结构+区间映射
- poj3003&2397 DP 记录路径
- poj 1141 Brackets Sequence(区间DP记录路径)
- POJ 1141 Brackets Sequence (区间dp 记录路径)
- POJ 1141Brackets Sequence (区间dp记录路径)
- poj 1141 (区间dp记录路径问题)
- ZOJ3541与时间相关的区间dp+记录路径
- POJ 1142 Brackets Sequence(区间dp,记录路径,还原括号匹配)
- POJ 1141 Brackets Sequence(区间DP记录路径)
- POJ 1141 / UVa 1626 Brackets Sequence (区间DP&打印路径)
- hdu1160 FatMouse's Speed--DP&记录路径
- poj1141Brackets Sequence【区间dp+路径记录】
- hdu1160 FatMouse's Speed (dp,记录路径)
- 记录路径dp-4713-Permutation
- PAT L3-001. 凑零钱(背包&路径记录)