Uva1625 -Color Length(DP)

Uva1625 -Color Length题意:有两个颜色序列(由大写字母表示),每次可以从两个序列中取出第一个颜色,重复此操作将两个序列合并,定义lc为颜色c在合并后的序列中最后出现的位置与最开始出现的位置的差,求使得所有颜色的lc之和最小的值。 分析:很明显的无后效性,考虑dp,这题的难点就在于怎么进行规划。首先定义dp[i][j]为从第一个颜色序列中拿走前i个颜色,从第二个颜色中
摘要由CSDN通过智能技术生成

Uva1625 -Color Length

题意:有两个颜色序列(由大写字母表示),每次可以从两个序列中取出第一个颜色,重复此操作将两个序列合并,定义lc为颜色c在合并后的序列中最后出现的位置与最开始出现的位置的差,求使得所有颜色的lc之和最小的值。

 

分析:很明显的无后效性,考虑dp,这题的难点就在于怎么进行规划。首先定义dp[i][j]为从第一个颜色序列中拿走前i个颜色,从第二个颜色中拿走前j个颜色时合并产生的序列的最小lc之和,根据题意那么我们需要在转移的过程中需要知道一种颜色最开始的位置与最后的位置,显然从状态中无法得知,那么怎么办呢,不可能在状态中记录这些信息,空间时间无法承受,那么怎么办呢?转换一种思路,还是很巧妙的,做的时候真的没想到。从计算方式上考虑,如果一个颜色已经移到序列中,不要等到一个颜色全部移完才计算,而是只要这个颜色没有全部移动到最终的序列,那么lc就要加1,只不过计算方式是不断的累加罢了,而前面这些通过当前移除的颜色个数i,j可以很容易的知道。所以,我们只需要记录每种颜色在两个序列中最开始出现的位置和最后出现的位置,那么便可以进行规划了。

刚开始自己一直在死磕,死活做不出,熬了一个星期左右,无奈看了紫书上面的思路,之后便动手开始自己实现,思路还是很清晰的,可以写出来之后样例一直过不去,然后就调试了一天半,后面才发现我写的程序的bug太多了,哎…

 

这道题思路巧妙而且细节甚多,有

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值