usaco2007open Cheapest Palindrome
题目来源:POJ3280
分析
题目大意为:
给定一个长度为M(M<=2000)的小写字母串
给定串中出现的N种字母的添加和删除代价
可以在任意位置加入或删除任意字母,代价如给定
求使原串变形为回文串的最小代价
解法
刚开始的思路非常复杂,储存两个代价,并且递归处理
(left,right)之外的回文串(之间的已为回文),然后分各种情况讨论。这又犯了想当然的毛病,而且每次都是打到一半才发现算法不完善,情况考虑未完整,影响很致命。
其实这题的解法很简单。
首先注意到当在处理(left,right)时,
如 …a(…)b… ()中为已处理完的回文串。此时删除和添加a所获得的效果和影响是一样的,因此我们只要在预处理时保留min(add[i],delete[i])就可以了。
优化
dp
详解
cost[left,right] 表示将left,right区间内字符串变成回文串
有三种情况
a(…)a 这类代价直接等于(…)中代价
a(…)b 有两种处理,
后处理 a : cost[a] + cost[ (…)b ]
后处理 b : cost[b] + cost[ a(…) ]
1 | cost[left,right] = |
细节
cost[i,i]=0 单个字符
cost[i,i-1]=0 空串
源程序
1 | Program Lwx; |