区间DP大法。i 到 j范围内。。
https://www.youtube.com/watch?v=Ci39lcoLbyw
8月30日。。。终于算是理解了这个究极DP题。。。太变态了
类似题: 石子排序。 区间DP经典题。
https://mp.weixin.qq.com/s?__biz=MzA5MzE4MjgyMw==&mid=400674993&idx=1&sn=8c3f329c2b37b14a877b5fc911ee20d2&mpshare=1&scene=1&srcid=0317iP3nlANyWGEfYZFqPdRB&key=58168eb9596d1ecabc3fac3215d2e1600ddcde51396c7e580ce94e8712a041c038315ca896df410818b397af4d0456ed323cf0ec1a61b3035f93321e326a14fa513bd03208dfb49fdfc7b133122ca96b&ascene=0&uin=MTUyMzg3NjAwMA%3D%3D&devicetype=iMac+MacBookAir7%2C1+OSX+OSX+10.12.3+build(16D32)&version=12020010&nettype=WIFI&fontScale=100&pass_ticket=0AiIToHJN8yqpuqRAsA5PaaQMJr8KtvlnZ2EqkX0zx%2BEZweRvHKyF%2ByjmycpUbVn
“本题中分析的过程很重要,本题是区间DP的好题,首先会考虑暴力的方法,但是时间复杂度特别高。如果面试者做过基础题目Stone Game 并且能够follow up想到这道题区间的性质,发现两题非常类似的话,用n^3的dp算法解决,那么就可以达到hire的程度” From 9章算法
这尼玛。。。还是得做过Stone Game。
这边这个分析出subproblem的思路很好。
看起来九章算法很喜欢DP结合着recursion用。可以可以很牛逼。大概看懂stone这题的逻辑了。 就是for loop,但是把石头从0 到n 分成了3个区间。 左半部分区间,中间,右半部分区间。 然后求出各个区间的最优解。 不过for 循环到后面, k < end的时候。 left还是包含了从0到n的全部区间。 右边到最后就啥也不包括了。 sum这个array是这样:
sum[0] =0. sum[1] = 第一个石子堆里的数量。 sum[2]=第一个石子堆+第二个石子堆的数量。。。。sum[end+1] = 所有石子堆的总石子。这个sum是我一直没搞懂的:比如m(1,3)=m(1,1)+m(2,3)+sum(1,2) 为什么是这样? 假设一共3个石头堆,第一次我们把石头堆2和石头堆3合并了 这俩一共20个石头。 now,我们要把2&3 合体堆与 石头堆1合并。 假设石头堆1 有5个石头。那这一轮=20+5=25个石头。 重点!我们还得把第一轮的得分20加上来!所以sum是记录之前得分的东西!所以所谓区间DP就是从i到j这个区间的 solution。
basketwang:https://www.youtube.com/watch?v=Ci39lcoLbyw&t=437s
state的定义最关键:是一个transition DP state. left, ......, i, ...., right.
DP[left][i] 表示戳破left到i中间的气球最大得分。不包括left, 和i. 之前我做的时候,道理我都懂。但是就是不知道怎么知道 当前i 气球隔壁left, right相邻没被戳破的是谁。
distance也是一个超级重要的。是left 和 right 之间的距离。比如 2 3 4我们唯一能做的是把3戳破。