题目本身,没什么好说的了。记得第一天练DP的时候就是叫我做的这个题,这个哪里做得出来啊。现在怎么说也比原来好点了。
这个题实际上是跟POJ 1141是一样的,几乎一模一样。
但是这个ZOJ太奇葩了,这个题目的输入让我无语了。后来我看了一下提交的结果。。提交了两千多次,没有PE,只有WA。。。这个就无语了,题目要求的那些空行让人凌乱啊。
下面贴代码:
View Code
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int MAX = 1<<30; 6 char str[120]; 7 int a[120][120],dp[120][120]; 8 void printans(int i,int j) 9 { 10 if(i > j) 11 return; 12 if(i == j) 13 { 14 if(str[i] == '(' || str[i] == ')') 15 cout<<"()"; 16 if(str[i] == '[' || str[i] == ']') 17 cout<<"[]"; 18 } 19 else if(a[i][j] == -1) 20 { 21 cout<<str[i]; 22 printans(i + 1,j - 1); 23 cout<<str[j]; 24 } 25 else 26 { 27 printans(i,a[i][j]); 28 printans(a[i][j] + 1,j); 29 } 30 } 31 int main() 32 { 33 int ncase,n,i,j,k,m,len; 34 cin>>ncase; 35 getchar(); 36 for(n = 1;n <= ncase;n++) 37 { 38 if(n > 1) 39 cout<<endl; 40 getchar(); 41 cin.getline(str,101); 42 len = strlen(str); 43 for(i = 0;i < len;i++) 44 { 45 for(j = 0;j < len;j++) 46 { 47 if(i < j) 48 dp[i][j] = MAX; 49 else if(i == j) 50 dp[i][j] = 1; 51 else 52 dp[i][j] = 0; 53 } 54 }//初始化dp数组 55 for(m = 1;m <= len;m++) 56 { 57 for(i = 0;i < len - m;i++) 58 { 59 j = i + m; 60 if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']')) 61 { 62 dp[i][j] = dp[i + 1][j - 1]; 63 a[i][j] = -1; 64 } 65 for(k = i;k <= j;k++) 66 { 67 int t = dp[i][k] + dp[k + 1][j]; 68 if(t < dp[i][j]) 69 { 70 dp[i][j] = t; 71 a[i][j] = k; 72 } 73 } 74 } 75 }//for i 76 printans(0,len - 1); 77 cout<<endl; 78 }//while 79 return 0; 80 }