[C - Brackets] 区间dp
Posted echozqn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C - Brackets] 区间dp相关的知识,希望对你有一定的参考价值。
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
",#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
",dp[1][n]);
}
return 0;
}
以上是关于[C - Brackets] 区间dp的主要内容,如果未能解决你的问题,请参考以下文章
POJ 1141 Brackets Sequence (区间DP)