DP专题 5 | 颜色的长度 - UVA1625(线性DP)

该博客介绍了如何解决UVA1625问题,这是一个关于颜色序列合并的动态规划(DP)问题。目标是找到最优合并方式,使颜色的跨度和最小。博主分享了思路,包括状态转移方程和利用预处理数组优化的方法,讨论了如何在DP过程中更新状态并使用滚动数组降低空间复杂度。
摘要由CSDN通过智能技术生成

【题意】 

输入两个长度分别为n和m的颜色序列(n,m<=5000),要求按一定规则合并成一个序列,规则是每次可以把一个序列开头的颜色放到新序列的尾部。例如对于序列GBBY和YRRGB,它们可以合成很多中结果,其中包含这样两种结果,GBYBRYRGB和YRRGGBBYB,对于每个颜色c来说,其跨度L(c)等于新序列中颜色c出现的最大位置和最小位置之差,比如对于上面的两种结果,每个颜色的L(c)和相应的总和如下表所示

 

你的任务是找到一种最合理的合并方式,使得新序列的L(c)总和最小

 

【思路】 

       紫书276页的一道例题,一开始连状态转移怎么转都想不出来,看了紫书的讲解也也很晕,最后是看了好多别人的题解之后才弄明白的。首先dp的状态就是书上所讲,但我的求解顺序和书上是反过来的,dp(i,j)表示的是从第一个序列头部取走i个元素,第二个序列头部取走j个元素的状态下当前的花费值,所以最后的答案就是dp(n,m). 不难想到dp(i,j)的状态一定是从dp(i-1,j)和dp(i,j-1)的状态转移而来的,所以状态转移方程就一定是这样一个类似于LCS问题的式子 

       dp(i,j) = min {dp(i-1,j), dp(i,j-1)} + x 

       那这个x是个什么,按照书上所说,每次状态转移的时候,都要把所有的“已经出现但还没结束”的颜色的L(c)值加1,所以在dp(i-1,j)向dp(i,j)的转移过程中,这个x就应该是第一个字符串的前i-1个字符和第二个字符串的前j个字符中所有“已经出现但还没结束”的字符个数,同理在dp(i,j-1)向dp(i,j)的转移过程中,这个x就应该是第一个字符串的前i个字符和第二个字符串的前j-1个字符中所有“已经出现但还没结束”的字符个数。

       结合下面的表格,比如两个原始序列为题目描述中的GBBY和YRRGB,现在的状态是dp(1,3)也就是从第一个字符串中取出G,第二个字符串中取出YRR,假设新序列是YRRG,现在要向着dp(1,4)做状态转移,也就是要再从第二个字符串中把G取出来,这时字母Y的头上要加1,G的头上要加1,R不用管因为R已经全部结束了,两个字符串中已经没有R了。所以现在的状态转移x的值为2,也就是dp(1,3)对应的新串中“已经出现但还没结束”的字符

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值