小码妹有一个长度为 n 的字符串 s 和一个大小为 m 的字符集 现在小码妹希望通过对字符串 s 增加或删去字符,使得 s 变为一个回文串 但是增加或删去不同字符需要花费的代价不同 小码妹希望花费最少的代价达成目标,于是她想寻求你的帮助 输入格式:第一行两个正整数 m和n,分别表示字符集大小和s的长度; 第二行为字符串 s; 接下来 m 行,每行由一个字符 c(数据保证字符c唯一)和两个整数 x,y 组成,之间用空格隔开,表示在 s字符串增加字符 c 需要 x的代价,删去字符 c 需要y 的代价。 输出格式:输出一个整数,表示将 s变为回文串需要的最小代价。 样例 输入:3 4 abcba a 1009 1100 b 350 700 c200 800 输出:900 测试数据保证 1<=m<=26,1<=n <= 2000,1<=x,y <= 10000 且字符集为小写英文字母的子集
时间: 2024-04-09 19:28:59 浏览: 194
```python
def getMinCost(s, m, n, c, x, y):
dp = [[0] * n for _ in range(n)]
for length in range(2, n+1):
for i in range(n - length + 1):
j = i + length - 1
if s[i] == s[j]:
dp[i][j] = dp[i+1][j-1]
else:
add_cost = x[ord(s[i]) - ord('a')] + dp[i+1][j]
remove_cost = y[ord(s[j]) - ord('a')] + dp[i][j-1]
dp[i][j] = min(add_cost, remove_cost)
return dp[0][n-1]
# 输入
m, n = map(int, input().split())
s = input()
c = []
x = []
y = []
for _ in range(m):
char, cost1, cost2 = input().split()
c.append(char)
x.append(int(cost1))
y.append(int(cost2))
# 输出
print(getMinCost(s, m, n, c, x, y))
```
这段代码使用了动态规划的思想。定义一个二维数组dp,其中dp[i][j]表示将字符串s的子串s[i...j]变为回文串所需要的最小代价。初始化时,所有dp[i][i]都为0,表示单个字符本身就是回文串。
然后,通过遍历子串的长度和起始位置来计算dp[i][j]。如果s[i]和s[j]相等,则dp[i][j]等于dp[i+1][j-1],因为只需要将两边的子串变为回文串即可。
如果s[i]和s[j]不相等,则需要选择增加或删除字符来使其相等。假设c是s[i]或s[j]中的一个字符,那么增加字符c的代价是x[ord(c) - ord('a')],删除字符c的代价是y[ord(c) - ord('a')]。因此,dp[i][j]等于x[ord(s[i]) - ord('a')] + dp[i+1][j]和y[ord(s[j]) - ord('a')] + dp[i][j-1]中的较小值。
最后,返回dp[0][n-1],即整个字符串s变为回文串所需要的最小代价。
注意:在Python中,字符串是以'\n'结尾的字符数组,可以直接使用input函数读取字符串。另外,ord函数可以将字符转换为对应的ASCII码。
阅读全文