poj 2955 区间dp

题意:

由‘(’ , ‘)’ , ‘[’ , ‘]’组成的字符串s,输出满足括号匹配原则的子串的最大长度。

题解:

1.dp[i][j]表示[i , j]这个区间内满足括号匹配原则的子串的最大长度

2.假如s[l] = s[r]dp[l][r] = max(dp[l][r] , dp[l + 1][r - 1] + 2)

3.然后用j遍历[l , r - 1]的点,dp[l][r] = max(dp[l][r] , dp[l][j] + dp[j + 1][r])

4.最外层的循环是区间长度,随着区间长度的增大,最终获得想要的答案

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 105
using namespace std ;
int main()
{
	int i , j , k , l , r ;
	int len ;
	int dp[N][N] ;
    char s[N] ;
    while(scanf("%s" , s) && s[0] != 'e')
    {
    	memset(dp , 0 , sizeof(dp)) ; 
    	len = strlen(s) ;
        for(i = 0 ; i < len - 1 ; i ++)
           if(s[i] == '(' && s[i + 1] == ')' || s[i] == '[' && s[i + 1] == ']')
              dp[i][i + 1] = 2 ;
    	for(i = 2 ; i < len ; i ++) //i控制长度 
    	   for(l = 0 ; l + i < len ; l ++) 
    	   {
    	   	 r = l + i ;
    	   	 if(s[l] == '(' && s[r] == ')' || s[l] == '[' && s[r] == ']') 
    	   	   dp[l][r] = max(dp[l][r] , dp[l + 1][r - 1] + 2) ;
    	     for(j = l ; j < r ; j ++)
    	        dp[l][r] = max(dp[l][r] , dp[l][j] + dp[j + 1][r]) ;
		   }
		printf("%d\n" , dp[0][len - 1]) ;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值