#456. 括号匹配问题
跟我一样帅气逼人的链接
我做区间dp做到现在都是三重循环,是不是区间dp必须是三重循环???
好的我们看题,中间还是区间dp常规的3重循环,若此区间开始和结尾相匹配,则dp[开始][结束]=dp[开始+1][结束-1]+2,反之,模拟从开始到结束的每一个点,进行状态转移
下面是代码:
1 #include<set> 2 #include<map> 3 #include<list> 4 #include<queue> 5 #include<stack> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<vector> 10 #include<bitset> 11 #include<memory> 12 #include<utility> 13 #include<cstdio> 14 #include<sstream> 15 #include<iostream> 16 #include<cstdlib> 17 #include<cstring> 18 #include<algorithm> 19 using namespace std; 20 21 int z,y; 22 int dp[105][105]; 23 string zy; 24 25 int ma(int a,int b){return a>b?a:b;} 26 27 int main(){ 28 while(1){ 29 cin>>zy; 30 if(zy[0]=='e'){ 31 break; 32 } 33 z=zy.size(); 34 memset(dp,0,sizeof(dp)); 35 for(int l=1;l<z;l++){ 36 for(int i=0,j=i+l;i<z-1&&j<z;i++,j=i+l){ 37 if((zy[i]=='('&&zy[j]==')')||(zy[i]=='['&&zy[j]==']')){ 38 dp[i][j]=dp[i+1][j-1]+2; 39 } 40 for(int k=i;k<=j;k++){ 41 dp[i][j]=ma(dp[i][j],dp[i][k]+dp[k+1][j]); 42 } 43 } 44 } 45 printf("%d\n",dp[0][z-1]); 46 } 47 return 0; 48 }
all right就酱紫了
no!!还有就是新人开博鼓励一下吧~~