#include <iostream>
#include <algorithm>
using namespace std;
const int M =2100;
int cost[M],dp[M][M]; // dp[i][j] 从 i~j 变为回文的最小花费
char str[M];
int main()
{
int n,k;
cin>>n>>k;
scanf("%s",str);
for(int i=0;i<n;i++)
{
char c;
int a,b;
cin>>c>>a>>b;
cost[c-'a']=min(a,b); // 对字符c进行 增加和删除产生效果都相同
}
for(int i=k-1;i>=0;i--)
{
for(int j=i+1;j<k;j++)
{
if(str[i]==str[j])
{
dp[i][j]=dp[i+1][j-1];
}
else //若头尾不同 两种决策 : 修改头或者修改尾
{
dp[i][j]=min(dp[i+1][j]+cost[str[i]-'a'],dp[i][j-1]+cost[str[j]-'a']);
}
}
}
cout<<dp[0][k-1]<<endl;
return 0;
}
poj 3280 dp回文
最新推荐文章于 2021-08-12 16:23:05 发布