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";
    }
}

 

posted @ 2020-06-10 22:05  Kanoon  阅读(107)  评论(0)    收藏  举报