70pts WA求助
查看原帖
70pts WA求助
329156
HansQAQ楼主2024/7/20 19:29

我先看了一些题解,有点不清楚为啥一定要分成两个小区间(我不知道我的dp思路哪里错了)

#include <iostream>
#include <cstring>
using namespace std;

string target;
int dp[105][105];
int main() {
	cin >> target;
	int n = target.size();
	memset(dp, 0x3f3f3f, 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 (target[l] == target[r]) {
				if (len == 2) {
					dp[l][r] = 1;
				}
				else {
					dp[l][r] = min(min(1 + dp[l + 1][r - 1],1 + dp[l + 1][r]),1 + dp[l][r - 1]);
				}
			}
			else {
				if (len == 2) {
					dp[l][r] = 2;
				}
				else {
					dp[l][r] = min(min(2 + dp[l + 1][r - 1], 1 + dp[l + 1][r]), 1 + dp[l][r - 1]);
				}
			}
			if (target[l] == target[l + 1]) {
				dp[l][r] = min(dp[l][r], dp[l + 1][r]);
			}
			if (target[r] == target[r - 1]) {
				dp[l][r] = min(dp[l][r], dp[l][r - 1]);
			}
			//cout << "dp[" << l << "][" << r << "] = " << dp[l][r] << endl;
		}
	}
	cout << dp[0][n - 1];
}


2024/7/20 19:29
加载中...