/*
date: 2016/11/5
writer: CN_swords
题意:
给你一个字符串,寻找最长的匹配串的长度。
题解:
定义:dp[i][j] 代表区间(i,j)最长匹配串的长度; 初始化: dp[i][j] = 0;
对于dp[i][j],在(i+1,j)区间如果没找到与i匹配的字符,dp[i][j] = dp[i+1][j];
在(i+1,j)区间如果找到与i匹配的字符,位置为k,那么dp[i][j] = dp[i+1][k-1]+dp[k+1][j]+2;
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
char s[N];
int dp[N][N];
bool pan(char a,char b)
{
if(a == '(' && b == ')')
return 1;
if(a == '[' && b == ']')
return 1;
return 0;
}
int main()
{
while(~scanf("%s",s))
{
if(strcmp(s,"end") == 0)
break;
int slen = strlen(s);
memset(dp,0,sizeof(dp));
for(int len = 1; len < slen; len++)
{
for(int i = 0; i+len < slen; i++)
{
int l = i, r = i+len;
dp[l][r] = dp[l+1][r];
for(int k = l+1; k <= r; k++)
{
if(pan(s[i],s[k]))
dp[l][r] = max(dp[l][r],((k-l>=3)?dp[l+1][k-1]:0)+dp[k+1][r]+2);
}
}
}
printf("%d\n",dp[0][slen-1]);
}
return 0;
}
【区间dp】POJ 2955 Brackets
最新推荐文章于 2021-02-13 23:43:58 发布