usaco beads 再一次对DP的了解

     刚做这个题目的时候,我不是用DP来做的,虽然效率还不错,但是写得很
乱。后来看了一下解题报告,看到了别人非常漂亮的用DP把它弄出来了,就想学
习一下动态规划的算法。这个题目是这样的,有一串项链,上面有三种颜色的珠
子,红,蓝,白,其中白色可以看作是与红色或蓝色同种颜色,如果在项链的某
一点处断开,那么在这一点处可以分别向左或向右收集到同种颜色的珠子,问从
哪一点处断开可以收集到最多的珠子数。并打印出最多的珠子的个数。
测试数据如下:
input

29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
output

11

在输入中w代表白色,b代表蓝色,r代表红色。收集到的11颗珠子为
wrwrrbwwwbb,是在第28和第29颗珠子中间断开。
这个题目用动态规划来解非常合适,动态规划的思想是:保存比较优的子解
然后用这些子解来构成最终的最优解。若要求在p点处断开能收集到的最多的
珠子,假设用max[p]来保存,则它是由从左边收集到的最多的珠子数和从右边
收集到的最多的珠子数组成的。而它所收集到的珠子可能是红色,也可能是蓝
色,分别用r[p],b[p]来存储,则对于左边而言。
r[0] = b[0] = 0;
if(c == 'r')
then r[p] = r[p-1]+1;
b[p] = 0;
if(c == 'b')
then b[p] = b[p-1]+1;
r[p] = 0;
if(c == 'w')
then r[p] = r[p-1]+1;
b[p] = b[p-1]+1;
对于右边则一样。只不过得从数组的未尾开始算即r[n] = b[n] = 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值