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