#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!!还有就是新人开博鼓励一下吧~~

posted @ 2019-07-02 21:27  喵呜,颜儿ღ  阅读(138)  评论(0编辑  收藏  举报