题目大意:给出删掉和添加每种字符的花费,求把字符串变成回文串的最小花费
题解:加入一个字母等价于在对称位置删除一个字母,所以费用取较小的就可以
然后根据知识知道回文串一般在串两边进行操作,据此大力转移
我的收获:……
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=2005;
int n,m,f[M][M],cost[255];
char str[M];
int dfs(int l,int r)
{
if(r<1||l>m) return 0;
if(l==r) return 0;
if(f[l][r]!=-1) return f[l][r];
int res=1000000;
res=min(dfs(l+1,r)+cost[str[l]],dfs(l,r-1)+cost[str[r]]);
if(str[l]==str[r]) res=min(res,dfs(l+1,r-1));
return f[l][r]=res;
}
void work()
{
memset(f,-1,sizeof(f));
printf("%d\n",dfs(1,m));
}
void init()
{
char tmp[50];int w1,w2;
scanf("%d%d%s",&n,&m,str+1);
for(int i=1;i<=n;i++)
{
scanf("%s%d%d",tmp,&w1,&w2);
cost[tmp[0]]=min(w1,w2);
}
}
int main()
{
init();
work();
return 0;
}