关闭

动态规划求解合唱队问题的思路

441人阅读 评论(0) 收藏 举报
分类:

动态规划求解合唱队问题思路:


该题的关键是不能置换队员的顺序,这个要求降低了问题的难度,如果可以排列的话就难了,建一个堆总会出现重复的元素,如何调整还没想出来怎么做。

考虑不能排列的情况,先对整个队列求一个最长递增子序列再求一个最长递降子序列。则剩下的人数就好算了。因为最长递增子序列是一个典型的动态规划问题,设子问题的解是FAscend[i]和FDescend[i]则合唱队问题的最优解是N-max[i]{FAscend[i]+ FDescend[i]-1}

关键:最优子结构的性质,递归定义子问题的解,自底向上求解

一, 最长递增子序列问题的描述:设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。

二, 最长递增子序列问题的最优子结构性质:

设f(i)表示序列中以ai为末尾元素的最长递增子序列的长度。注意此处,f(i)只表示一个长度,而并没有包含是哪个具体的序列,这是动态规划的一个显著特征。需要求是具体哪个序列需要回溯求解。

在求以ai为末尾的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i,且aj<ai。

如果这样的元素存在,那么对于所有的aj,都有一个以aj为末尾元素的最长递增子序列的长度,把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)+1,即f(i)=max[j]{f(j)+1},即以ai为末尾元素的最长递增子序列,等于以使f(j)最大的哪个aj为末尾元素的递增子序列最末再加上ai;

如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末尾元素的递增子序列。因为f(i)表示的长度必须以ai为末尾。

三, 实现:用f【】来保存最优值,外层循环扩大问题规模,即数组f的下表递增,内层循环遍历从i到1的子问题的最优值。

初始值f【1】=1。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49491次
    • 积分:1316
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:12篇
    • 译文:17篇
    • 评论:1条