poj 2955 Brackets(区间DP)

来源:互联网 发布:无网络装网卡驱动 编辑:程序博客网 时间:2024/05/16 09:29

经典区间DP--括号匹配

我们用dp[i][j]表示str[i]到str[j]能够匹配的最多括号数

则若str[i]与str[j]匹配可得dp[i][j] = dp[i+1][k-1]+dp[k+1][j](i<k<=j)

因为在计算dp[i][j]的过程中使用到dp[i+1][k-1]和dp[k+1][j]

所以要先计算出小区间的DP值

而外围循环从大到小刚好可以满足

代码如下:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 110using namespace std;char str[MAXN];int dp[MAXN][MAXN];int main(void) {    while(~scanf("%s", str)) {        if(strcmp(str, "end") == 0)            break;        memset(dp, 0, sizeof(dp));        int len = strlen(str);        //dp[i][j]表示以str[j]结尾的最大匹配长度        for(int i=len-1; i>=0; --i) {            for(int j=i+1; j<len; ++j) {                dp[i][j] = dp[i+1][j];                for(int k=i+1; k<=j; ++k) {                    if((str[i]=='('&&str[k]==')') || (str[i]=='['&&str[k]==']'))                        dp[i][j] = max(dp[i][j], dp[i+1][k-1]+dp[k+1][j]+2);                }            }        }        printf("%d\n", dp[0][len-1]);    }    return 0;}


0 0