POJ 2955のマッチングブラケット間隔DP

トピック:

文字の文字列を与えられたマッチの最大数は、ブラケットを尋ねます

アイデア:

0に初期化

1は、決意の解答の長さの各セグメントの長さから列挙端部が一対のブラケットはないし、[I] [J] = DPをDPされ始める[I + 1] [j - 1] + 2

決意が完了した後、DP [i] [j]は常に最大になります

ACコード

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>

using namespace std;

char s[105];
int dp[105][105];

bool check(int a,int b){
	if(s[a] == '(' && s[b] == ')') return 1;
	if(s[a] == '[' && s[b] == ']') return 1;
	return 0;
}

int main()
{
	while(~scanf("%s",s + 1)){
		if(s[1] == 'e') break;
		int n = strlen(s + 1);
		for(int i = 1;i <= n; i++){
			for(int j = 1;j <= n; j++){
				dp[i][j] = 0;
			}
		}
		for(int i = 1;i <= n; i++){//枚举长度
			for(int j = 1;j + i - 1 <= n; j++){//枚举开头
				int L = j + i - 1;
				if(check(j,L)){
					dp[j][L] = dp[j + 1][L - 1] + 2;
				}
				for(int k = j;k < L; k++){
					dp[j][L] = max(dp[j][L],dp[j][k] + dp[k + 1][L]);
				}
			}
		}

		printf("%d\n",dp[1][n]);
	}
}

 

公開された31元の記事 ウォンの賞賛5 ビュー1370

おすすめ

転載: blog.csdn.net/qq_43685900/article/details/102766127