题意:
思路: DP f[i][j]表示把i到j变成回文串的最少代价f[start][end]=f[start+1][end]+min(node[a[start]].del,node[a[start]].add);f[start][end]=min(f[start][end],f[start][end-1]+min(node[a[end]].add,node[a[end]].del));
//By SiriusRen#include#include #include using namespace std;int n,m,f[2222][2222];char a[2222],jy;struct Node{ int add,del;}node[256];int main(){ scanf("%d%d",&n,&m); scanf("%s",a+1); for(int i=1;i<=n;i++) scanf("\n%c",&jy),scanf("%d%d",&node[jy].add,&node[jy].del); for(int len=0;len<=m;len++){ for(int start=1;start<=m;start++){ int end=start+len; if(end>m)break; if(a[start]!=a[end]){ f[start][end]=f[start+1][end]+min(node[a[start]].del,node[a[start]].add); f[start][end]=min(f[start][end],f[start][end-1]+min(node[a[end]].add,node[a[end]].del)); } else{ f[start][end]=f[start+1][end-1]; } } } printf("%d\n",f[1][m]);}