poj3280

时间:2023-03-10 02:30:13
poj3280

将给定字符串用最小代价(添加,删除)变为回文串。

dp:dp[i][j]表示将i-j变为回文串的最小代价。

若s[i]==s[j],则dp[i][j]=dp[i+1][j-1]

否则,若s[i+1]--s[j]是回文串,则dp[i][j]=min(dp[i+1][j]+add[i],dp[i][j])

     若s[i]--s[j-1]是回文串,则dp[i][j]=min(dp[i][j-1]+add[j],dp[i][j])

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char s[],ch;
int n,m,a,b;
int add[],dp[][];
int main(){
scanf("%d%d",&n,&m);
scanf("%s",s);
for (int i=;i<=n;i++){
cin>>ch;
scanf("%d%d",&a,&b);
add[ch]=min(a,b);
}
for (int k=;k<m;k++)
for (int i=,j=k;j<m;i++,j++){
dp[i][j]=0x7fffffff;
if (s[i]==s[j]) dp[i][j]=dp[i+][j-];
else{
dp[i][j]=min(dp[i+][j]+add[s[i]],dp[i][j]);
dp[i][j]=min(dp[i][j-]+add[s[j]],dp[i][j]);
}
}
printf("%d\n",dp[][m-]);
return ;
}