poj2955 区间DP

Posted 文竹balala

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2955 区间DP相关的知识,希望对你有一定的参考价值。

题意:

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

分析:

很容易想到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;



以上是关于poj2955 区间DP的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2955:Brackets(区间DP)

POJ 2955 Brackets (区间DP)

Brackets POJ - 2955 (区间dp)

poj 2955 Brackets 括号匹配 区间dp

POJ 2955 Brackets(区间DP)题解

poj2955 区间DP