许诺 • 3个月前
#include <iostream>
#include <vector>
#include <climits>
#include <unordered_map>
using namespace std; int main() {
int n, m;
cin >> n >> m;
string s;
cin >> s;
unordered_map<char, int> add_cost, del_cost;
for (int i = 0; i < n; ++i) {
char c;
int add, del;
cin >> c >> add >> del;
add_cost[c] = add;
del_cost[c] = del;
}
vector<vector<int>> dp(m, vector<int>(m, 0));
for (int len = 2; len <= m; ++len) {
for (int i = 0; i <= m - len; ++i) {
int j = i + len - 1;
if (s[i] == s[j]) {
dp[i][j] = (len == 2) ? 0 : dp[i+1][j-1];
} else {
int add_left = add_cost[s[i]] + dp[i+1][j];
int add_right = add_cost[s[j]] + dp[i][j-1];
int del_left = del_cost[s[i]] + dp[i+1][j];
int del_right = del_cost[s[j]] + dp[i][j-1];
dp[i][j] = min(min(add_left, add_right), min(del_left, del_right));
}
}
}
cout << dp[0][m-1] << endl;
return 0;
}
评论:
请先登录,才能进行评论