POJ 2955 区间dp

来源:互联网 发布:英文版导航软件 编辑:程序博客网 时间:2024/04/29 18:40

题意:求括号匹配的最大长度

思路:简单区间dp,令dp[i][j] 为 区间(i,j)之间的最大匹配长度。

这样dp[i][j]  = max( dp[i][j] , dp[i][x] + dp[x+1][j] )  i<x<j

不过dp[i][j] 得先初始化,为dp[i+1][j-1]  或者 dp[i+1][j-1]  +2 ;


#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;int const maxn = 110;char str[maxn];int dp[maxn][maxn];int main(){    while(scanf("%s",str)!=EOF)    {        if(str[0]=='e')break;        int n = strlen(str);        memset(dp,0,sizeof(dp));        for(int i = 0 ; i < n ; i++)        {//初始化            dp[i][i] = 0 ;            if((str[i]=='('&&str[i+1]==')')||(str[i]=='['&&str[i+1]==']'))                dp[i][i+1] = 2 ;            else dp[i][i+1] = 0 ;        }        for(int k = 2 ; k < n ; k++)        {            for(int i = 0 , j = k  ; j < n ; j++ , i++)            {    //每次i和j相隔k个距离                if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']'))   //匹配                    dp[i][j] = dp[i+1][j-1] + 2 ;                for(int x = i ; x < j ; x++)   //区间最值合并                {                    dp[i][j] = max(dp[i][j],dp[i][x] + dp[x+1][j]);                }            }        }        printf("%d\n",dp[0][n-1]);    }    return 0;}/*Auther:LIUYAN2015.12.16((()))()()()([]]))[)(([][][)end*/


0 0
原创粉丝点击