最大/小和子序列问题
这是个很经典的问题,任何一本书上都会有介绍。
用动态规划的解法。 恩好吧 ,动态规划
1 最优子结构 2 记忆。
这个问题的最优子结构特性是很容易想到的。
由于要的是子序列是相邻的,因此需要按照固有的位置顺序一个个逐步的引入,那么就是从左到右的扫描以逐步扩大问题的规模。
下面就是如何从i-1规模的解计算规模i的解。注意在这一过程中,好吧既然有最优子结构了,那么我们要尝试使用动态规划。
动态规划不同于递归的一个特性就是记忆,就是在计算规模i的时候要用到之前规模的计算出的数据,以此来避免重复计算,
我想 我想想想
我首先想到了,既然是要求规模i的最值,而且已知了规模i-1时候的最值,又可以用到以前的值,
那我们就需要找到规模 i 时候的一个局部极值,把这个极值和i-1规模时候的最值进行比较,这样来确定i的最值。
好吧 无论如何既然是求子序列的和不可避免的要对多个临近元素求和,也就需要求集合i中的多个相邻的元素和,恩 ,回到了原点。
不,我们已经知道i-1时候的最值,也就意味着不需要求i的所有可能相邻元素的和,而只需求其中的一个子集,
这个子集呢应该是i-1所无法求的(因为我们假设i-1的最值已解,如果这个子集存在于i-1中那么就已经算过了),
呵呵,bingo
要相邻元素的和还要不是i-1的子集,这丫只有一种序列,就是以元素a[i]为结尾的各种序列。
恩,明确了要计算序列结构,下一步就是计算他,别忘了我们有记忆这个特性还没用,怎么用呢,
想想对于任意一个i我们都要求以a[i]为结尾的各种子序列的和,而我们要求的是尾元素固定,起始元素不定的序列和。
哈哈再想不起来怎么做就说不过去了,
sum(i,j)=sum(0,j)-sum(0,i)
这个就是所谓的前缀和。
任何巧妙的想法都是要一步一步的思考,在碰壁之后得来的。