WA #1 求条
查看原帖
WA #1 求条
764666
LostKeyToReach楼主2024/8/6 09:49
#include <bits/stdc++.h>
#define ll long long
#define debug(x) cerr << (#x) << '\n'
#define pii pair <int, int>
#define pb emplace_back
#define chkmin(x, y) x > y ? x = y : 0
#define chkmax(x, y) x < y ? x = y : 0
#define L(i, a, b) for (int i = (a); i <= (b); i++)
#define R(i, a, b) for (int i = (a); i >= (b); i--)
using namespace std;
int n, dp[605][605];
string s;
bool comp(int l, int r) {
	return (s[l] == '(' && s[r] == ')') || (s[l] == '[' && s[r] == ']');
}
void write(int l, int r) {
	if (l > r) return;
	if (l == r) {
		if (s[l] == ')' || s[l] == '(') cout << "()";
		else cout << "[]";
		return;
	}
	if (dp[l][r] == dp[l + 1][r - 1] && comp(l, r)) {
		cout << s[l];
		write(l + 1, r - 1);
		cout << s[r];
		return;
	}
	for (int i = l; i < r; i++) {
		if (dp[l][r] = dp[l][i] + dp[i + 1][r]) {
			write(l, i), write(i + 1, r);
			return;
		}
	}
}
int main() {
	int t;
	cin >> t;
	while (t--) {
//		cin >> n;
        getline(cin, s);
        getline(cin, s);
	//	s = s;
		n = s.size();
		if (n == 0) {
			cout << "\n\n";
			continue;
		}
		// --n;
		memset(dp, 0, sizeof dp);
		for (int i = 0; i < n; i++) {
			dp[i][i] = 1;
		}
		for (int len = 2; len <= n; len++) {
			for (int l = 0; l + len - 1 < n; l++) {
				int r = l + len - 1;
				if (s[l] == '(' && s[r] == ')' || s[l] == '[' && s[r] == ']') {
					dp[l][r] = dp[l + 1][r - 1];
				} else {
					dp[l][r] = min(dp[l + 1][r], dp[l][r - 1]) + 1;
				}
				for (int k = l; k < r; k++) {
					dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r]);
				}
			}
		}
		write(0, n - 1);
		cout << '\n';
		if (t) cout << '\n';
	}
}
2024/8/6 09:49
加载中...