您的位置:首页 > 其它

poj2955 区间DP

2016-02-12 16:16 357 查看
题意:

求一个字符串最多有多少个字符括号可以相互匹配

分析:

很容易想到dp,状态f[i][j]表示i到j最多可以匹配的字符数

状态转移方程:即要么给i从后边匹配一个字符串,要么不匹配i直接与f[i+1][j]相比较

if (a[i] == a[k]) f[i][j] = max(f[i][j], f[i+1][k-1] + f[k+1][j] + 2);

else dp[i][j] = max(dp[i][j], dp[i+1][j]);

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

#define ll long long
const int maxn = 105;
char s[maxn];
int dp[maxn][maxn];

bool equals(char a, char b)
{
    if ((a == '(' && b == ')') || (a == '[' && b == ']'))
        return true;
    else return false;
}

int main()
{
    //freopen("input.txt", "r",  stdin);
    while(scanf("%s", s) == 1)
    {
        if (strcmp(s, "end") == 0)
            break;
        memset(dp, 0, sizeof(dp));
        int len = strlen(s);
        for (int w = 2; w <= len; w++)
        {
            for (int i = 0; i + w - 1 < len; i++)
            {
                int j = i + w - 1;
                for (int k = i+1; k <= j; k++)
                {
                    if (equals(s[i], s[k]))
                        dp[i][j] = max(dp[i][j], dp[i+1][k-1]+dp[k+1][j]+2);
                    dp[i][j] = max(dp[i][j], dp[i+1][j]);
                }
            }
        }
        printf("%d\n", dp[0][len-1]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: