来源:POJ3280
增加或者减少字符串使得串是回文串
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,len;
char x[2100],ch;
int dp[2100][2100];
int add[30],del[30];
/*转移方程
if(x[i]==x[j])
dp[i][j] = dp[i+1][j-1];
else
dp[i][j] =min(dp[i+1][j]+min(add[x[i]-'a'+1],del[x[i]-'a'+1]),dp[i][j-1]+min(add[x[j]-'a'+1],del[x[j]-'a'+1]));
*/
int main(){
char ch;
int a,b;
while(scanf("%d%d",&n,&len)!=EOF){
//cout<<n<<" "<<len<<endl;
getchar();
scanf("%s",x+1);
//cout<<x+1<<endl;
getchar();
//cout<<"start:"<<endl;
memset(add,0,sizeof(add));
memset(del,0,sizeof(del));
for(int i=0;i<n;i++){
// cout<<i<<":"<<endl;
scanf("%c%d%d",&ch,&a,&b);
// cout<<ch<<" "<<a<<" "<<b<<endl;
getchar();
add[ch-'a'+1] = a;
del[ch-'a'+1] = b;
}
memset(dp,0,sizeof(dp));
for(int l=1;l<=len;l++){
for(int i=1;i<=len-l+1;i++){
int j = i+l-1;
// cout<<i<<" "<<j<<" "<<l<<endl;
if(x[i] == x[j])
dp[i][j] = dp[i+1][j-1];
else
dp[i][j] =min(dp[i+1][j]+min(add[x[i]-'a'+1],del[x[i]-'a'+1]),dp[i][j-1]+min(add[x[j]-'a'+1],del[x[j]-'a'+1]));
}
}
cout<<dp[1][len]<<endl;
}
return 0;
}