码迷,mamicode.com
首页 > 其他好文 > 详细

[C - Brackets] 区间dp

时间:2020-07-08 23:18:49      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:std   子序列   lin   str   string   include   namespace   inline   %s   

C - Brackets 区间dp

题目大意:

给你长度为n的序列,问1~n的最长合法子序列是多长。

题解:

对于一个括号的匹配,有两种方法

  • 合法括号的嵌套
  • 合法括号的排列

如果是第一种转移方程是:\(dp[i][j]=dp[i+1][j-1]+2\)

如果是第二种转移方程是:\(dp[i][j]=dp[i][x]+dp[x+1][j]\)

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define id first
#define val second
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int maxn=110;
int dp[maxn][maxn];
char s[maxn];
int main(){
    while(scanf("%s",s+1)&&s[1]!=‘e‘){
        int n = strlen(s+1);
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++) dp[i][j]=0;
        }
        for(int len=2;len<=n;len++){
            for(int i=1;i+len-1<=n;i++){
                int j=i+len-1;
                for(int k=i;k<=j;k++){
                    if((s[i]==‘(‘&&s[j]==‘)‘)||(s[i]==‘[‘&&s[j]==‘]‘)) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
                    dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
                }
            }
        }
        printf("%d\n",dp[1][n]);
    }
    return 0;
}

[C - Brackets] 区间dp

标签:std   子序列   lin   str   string   include   namespace   inline   %s   

原文地址:https://www.cnblogs.com/EchoZQN/p/13269562.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!