Uva1625 -Color Length
题意:有两个颜色序列(由大写字母表示),每次可以从两个序列中取出第一个颜色,重复此操作将两个序列合并,定义lc为颜色c在合并后的序列中最后出现的位置与最开始出现的位置的差,求使得所有颜色的lc之和最小的值。
分析:很明显的无后效性,考虑dp,这题的难点就在于怎么进行规划。首先定义dp[i][j]为从第一个颜色序列中拿走前i个颜色,从第二个颜色中拿走前j个颜色时合并产生的序列的最小lc之和,根据题意那么我们需要在转移的过程中需要知道一种颜色最开始的位置与最后的位置,显然从状态中无法得知,那么怎么办呢,不可能在状态中记录这些信息,空间时间无法承受,那么怎么办呢?转换一种思路,还是很巧妙的,做的时候真的没想到。从计算方式上考虑,如果一个颜色已经移到序列中,不要等到一个颜色全部移完才计算,而是只要这个颜色没有全部移动到最终的序列,那么lc就要加1,只不过计算方式是不断的累加罢了,而前面这些通过当前移除的颜色个数i,j可以很容易的知道。所以,我们只需要记录每种颜色在两个序列中最开始出现的位置和最后出现的位置,那么便可以进行规划了。
刚开始自己一直在死磕,死活做不出,熬了一个星期左右,无奈看了紫书上面的思路,之后便动手开始自己实现,思路还是很清晰的,可以写出来之后样例一直过不去,然后就调试了一天半,后面才发现我写的程序的bug太多了,哎…
这道题思路巧妙而且细节甚多,有