http://poj.org/problem?id=3280
回文串,给你一串字符,通过添加删除其中的一部分,使其变成一个回文串,并且花费最小(添加删除都有权值)
dp[i][j] 表示 i ~ j 可以构成回文串的最小花费。
那么存在: dp[i][j] = Min(dp[i+1][j] + cost[i] , dp[i][j-1] + cost [j] ) (1)
如果 str[i] == str[j] 又存在 dp[i][j] = Min (dp[i+1][j-1] , dp[i][j] ) (2)
可以看到 (2) 状态 是 依托 (1) 状态的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 2010
#define Min(a,b) (a>b?b:a)
int cost[26];
char str[M];
int dp[M][M];
int main()
{
int n,m,i,j;
char ch[2];
while(~scanf("%d%d",&n,&m)){
scanf("%s",str);
while(n--){
scanf("%s %d %d",ch,&i,&j);
cost[ch[0]-'a'] = Min(i,j);
}
for(j=1;j<m;j++){
for(i=j-1;i>=0;i--){
dp[i][j] = Min(dp[i+1][j]+cost[str[i]-'a'],dp[i][j-1]+cost[str[j]-'a']) ;
if(str[i] == str[j]){
dp[i][j] = Min(dp[i][j],dp[i+1][j-1]);
}
}
}
printf("%d\n",dp[0][m-1]);
memset(dp,0,sizeof(dp));
}
return 0;
}