Uva1625 -Color Length(DP)

博客介绍了如何解决Uva1625问题,这是一个涉及动态规划(DP)的ACM竞赛题目。博主探讨了如何在两个颜色序列中找到最小LC(颜色长度差)和的策略,强调了处理颜色位置和优化空间复杂度的重要性。在实现过程中遇到了样例过不去、超时等问题,并分享了解决这些问题的经验教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Uva1625 -Color Length

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

 

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

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

 

这道题思路巧妙而且细节甚多,有以下几点要考虑:

1、  怎么处理每个颜色的位置?设cnt[i][j]为分别取走i个颜色和j个颜色时还有多少种颜色已经出现但尚未结束,cnt[i][j]由cnt[i-1][j](i大于0时)和cnt[i][j-1](j大于0时)转移而来,只需要在转移的时候判断当前取的这个颜色是否处在开始位置或者最后位置就行了。

2、  一种颜色在一个序列中没有出现的时候该怎么处理它的开始位置和最后位置?很明显在预处理位置的时候会有影响,那么开始位置初始化为INF,最后位置初始化为0即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值