POJ2955【區間DP】


題目鏈接【http://poj.org/problem?id=2955】

題意:[]、()的匹配問題,問一個[]()串中匹配的字符數,匹配方式為[X],(X),X為一個串,問一個長度為N(N<=100)串中最多的匹配字符個數。

思路:區間DP,dp[l][r]的意思是區間[l,r]的最大匹配數,預處理長度為2的所有區間的最大匹配數,然后由長度為2的區間推出長度為3的所有區間的最大匹配數,由長度為3的區間......在處理區間[l,r]的時候,如果s[l]與s[r]相匹配,那么dp[l][r]=dp[l+1][r-1]+2;然后再沒去區間[l,r]的每個斷點k,dp[l][r]=max(dp[l][r],dp[l][k],dp[k+1][r]);這一步是必須要執行的。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 150;
int dp[MAXN][MAXN];
char s[MAXN];
int main ()
{
    while(~scanf("%s", s + 1))
    {
        memset(dp, 0, sizeof(dp));
        if(s[1] == 'e') break;
        int len = strlen(s + 1);
        for(int l = 1; l <= len; l++)
            for(int i = 1; i <= len - l + 1; i++)
            {
                int j = i + l - 1;
                if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                for(int k = i; k < j; k++)
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
            }
        printf("%d\n", dp[1][len]);
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM