poj 1141 动态规划进行括号匹配
思路:黑书的例题
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define Maxn 1010 using namespace std; int dp[Maxn][Maxn],v[Maxn][Maxn]; char str[Maxn]; void Out(int s,int e) { if(s>e) return ; if(s==e) { if(str[s-1]=='('||str[s-1]==')') printf("()"); else printf("[]"); return ; } if(v[s][e]==-1) { printf("%c",str[s-1]); Out(s+1,e-1); printf("%c",str[e-1]); return ; } Out(s,v[s][e]); Out(v[s][e]+1,e); } int main() { int n,i,j,t,k; memset(dp,48,sizeof(dp)); memset(v,-1,sizeof(v)); scanf("%s",str); n=strlen(str); for(i=0;i<=n;i++) dp[i][i]=1,dp[i][i-1]=0; for(i=1;i<=n;i++) for(j=i-1;j>=1;j--){ if(str[i-1]==')'&&str[j-1]=='('||str[i-1]==']'&&str[j-1]=='[') { if(dp[i-1][j+1]<dp[i][j]) dp[i][j]=dp[i-1][j+1],v[j][i]=-1; } else { if(dp[i-1][j]<dp[i][j+1]) dp[i][j]=dp[i-1][j]+1,v[j][i]=i-1; else dp[i][j]=dp[i][j+1]+1,v[j][i]=j; } for(k=j;k<i;k++) { if(dp[i][k+1]+dp[k][j]<dp[i][j]) dp[i][j]=dp[i][k+1]+dp[k][j],v[j][i]=k; } } Out(1,n); printf("\n"); return 0; }