poj 3280 Cheapest Palindrome(区间dp)
题目链接:http://poj.org/problem?id=3280
题意
给定字符串 $s$,长度为 $m$,由 $n$ 个小写字母构成。在 $s$ 的任意位置增删字符,把它变为回文串,增删特定字母的花费不同。求最小花费。
题解
$dp_{ij}$ 表示将区间 $[i,j]$ 变为回文的最小花费。
代码
#include <iostream> using namespace std; const int N = 2020; int n, m, x, y, w[26], dp[N][N]; char s[N], ch; int main() { while (cin >> n >> m) { cin >> s; for (int i = 0; i < n; i++) { cin >> ch >> x >> y; w[ch - 'a'] = min(x, y); } for (int i = m - 1; i >= 0; i--) for (int j = i + 1; j < m; j++) if (s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1]; else dp[i][j] = min(dp[i + 1][j] + w[s[i] - 'a'], dp[i][j - 1] + w[s[j] - 'a']); cout << dp[0][m - 1] << "\n"; } }

浙公网安备 33010602011771号