poj 3280 Cheapest Palindrome

//参照poj1 1159 Palindrome
// 题意:对一字符串增加或删除字符来使其变成回文字符串,而增加或删除字符都有一个花费,
// 求解使该字符串变成回文串需要的最小花费.

#include <iostream> // DP + 滚动数组
#include <string>

using namespace std;
#define MAXN 2005
int ans[2][MAXN];
int main()
{
int n,m;
char s[MAXN];
scanf("%d%d%s",&m,&n,s);
char ch[2];
int a,b,cost[30];
while(m--)
{
scanf("%s%d%d",ch,&a,&b);
cost[ch[0]-'a']=min(a,b);
}
for (int i=n-1;i>=0;--i) // 注意i是从大到小,因为求解ans[i][j]过程需要先知道ans[i+1][j]
{

for (int j=i+1;j<n;++j)
{
int t1= cost[s[i]-'a'] + ans[(i+1)%2][j] ;
int t2= cost[s[j]-'a'] + ans[i%2][j-1] ;
if (s[i] == s[j])
ans[i%2][j] = min ( ans[(i+1)%2][j-1] , min ( t1 , t2 ) );
else
ans[i%2][j] = min ( t1 , t2 );
}
}
printf("%d\n",ans[0][n-1]); //相当于ans[0%2][n-1]
return 0;

}

posted on 2011-07-22 20:17  sysu_mjc  阅读(144)  评论(0编辑  收藏  举报

导航