Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 27793 | Accepted: 7885 | Special Judge |
Description
Input
Output
Sample Input
([(]
Sample Output
()[()]
Source
#include<stdio.h> #include<string.h> char str[330]; int a[330][330],b[330],dp[330][330]; void print(int l,int r) { if(l>=r) return; if(a[l][r]==-1) { print(l+1,r); } if(a[l][r]>0) { b[l]=1; b[a[l][r]]=1; print(l+1,a[l][r]-1); print(a[l][r],r); } } int main() { while(gets(str+1)) { int i,j,k; memset(dp,0,sizeof(dp)); memset(a,-1,sizeof(a)); memset(b,0,sizeof(b)); int len=strlen(str+1); for(i=1;i<=len;i++) { dp[i][i]=1; } for(i=len-1;i>=1;i--) { for(j=i+1;j<=len;j++) { dp[i][j]=dp[i+1][j]+1; //a[i][j]=-1; for(k=i+1;k<=j;k++) { if((str[i]==‘(‘&&str[k]==‘)‘)||(str[i]==‘[‘&&str[k]==‘]‘)) { if(dp[i][j]>dp[i+1][k-1]+dp[k][j]-1) { dp[i][j]=dp[i+1][k-1]+dp[k][j]-1; a[i][j]=k; // b[i]=1; // b[a[i][j]]=1; } } } } } print(1,len); for(i=1;i<=len;i++) { if(b[i]==1) { printf("%c",str[i]); } else if(str[i]==‘(‘||str[i]==‘)‘) printf("()"); else printf("[]"); } printf("\n"); } }
POJ 题目1141 Brackets Sequence(区间DP记录路径)
原文:http://www.cnblogs.com/Who-you/p/4854057.html