POJ 2955 brackets

来源:互联网 发布:模拟位置软件 编辑:程序博客网 时间:2024/06/03 10:20

今天开始进行日常的博客更新。

做的第一道区间dp题,思路是找一个可以递推的状态,这道题我重点思考了对于 ” ()() ” 和 ” ( ( ) )” 这两种形式的括号匹配的递推,于是发现新状态的递推有两种,dp[l][r] = dp[l+1][r-1] + 2 和 dp[l][r] = dp[l][k] + dp[k+1][r],于是此题可做。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int check(char a,char b){    if(a=='(' && b==')')        return 1;    if(a=='[' && b==']')        return 1;    return 0;}int main(){    char str[105];    int dp[105][105],i,j,k,len;    while(~scanf("%s",str))    {        if(!strcmp(str,"end"))            break;        len = strlen(str);        for(i = 0; i<len; i++)        {            dp[i][i] = 0;            if(check(str[i],str[i+1]))                dp[i][i+1] = 2;            else                dp[i][i+1] = 0;        }        for(k = 3; k<=len; k++)        {            for(i = 0; i+k-1<len; i++)            {                dp[i][i+k-1] = 0;                if(check(str[i],str[i+k-1]))                    dp[i][i+k-1] = dp[i+1][i+k-2]+2;                for(j = i; j<i+k-1; j++)                    dp[i][i+k-1] = max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]);            }        }        printf("%d\n",dp[0][len-1]);    }    return 0;}
原创粉丝点击