标签:
第一个区间dp题,果断百度的
蛮好理解,这里直接粘贴别人的题解啦,d是区间内需要添加的括号数
对于任何s[i]..s[j]应该分为两种情况考虑,一种是s[i]=‘(‘&& amp;s[j]=‘)‘ 或者s[i]=‘[‘&&s[j]=‘]‘,如果是这种情况,则d[i][j]=d[i+1][j-1],则i,j处不需要添加括号。做 一标记v[i][j]=-1;即可。还有一种情况就是上述条件不满足,则可以把s[i]..s[j]分成两段考虑,枚举i,j中间的点k,i=< k<j;即可。然后取d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]);同时应该对所取得k进行标记v[i] [j]=k。
1 #include<iostream> 2 #include<string> 3 #include<fstream> 4 #include<cstring> 5 using namespace std; 6 char s[101]; 7 int d[101][101],value[101][101],length; 8 void fun() 9 { 10 for(int p=0;p<length;p++)d[p][p]=1; //一个的话只需要一个就能匹配 11 for(int tem=1;tem<length;tem++) //枚举区间长度 12 for(int i=0;i<length-tem;i++) //i的起始位置 13 { 14 int j=tem+i; 15 d[i][j]=99999; 16 if((s[i]==‘(‘&&s[j]==‘)‘)||(s[i]==‘[‘&&s[j]==‘]‘))//1@ 17 { 18 d[i][j]=d[i+1][j-1]; 19 value[i][j]=-1; 20 } 21 for(int k=i;k<j;k++) 22 if(d[i][j]>d[i][k]+d[k+1][j]) 23 { 24 d[i][j]=d[i][k]+d[k+1][j]; 25 value[i][j]=k; 26 } 27 } 28 return; 29 } 30 void printpath(int i,int j) 31 { 32 if(i>j)return; 33 else if(i==j) 34 { 35 if(s[i]==‘(‘||s[i]==‘)‘)printf("()"); 36 if(s[i]==‘[‘||s[i]==‘]‘)printf("[]"); 37 }else if(value[i][j]==-1) 38 { 39 printf("%c",s[i]); 40 printpath(i+1,j-1); 41 printf("%c",s[j]); 42 }else { 43 printpath(i,value[i][j]); 44 printpath(value[i][j]+1,j); 45 } 46 return; 47 } 48 int main() 49 { 50 //freopen("1.in","r",stdin); 51 while(scanf("%s",s)!=EOF) 52 { 53 memset(d,0,sizeof(d)); 54 length=strlen(s); 55 fun(); 56 printpath(0,length-1); 57 printf("\n"); 58 } 59 return 0; 60 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4264200.html