312. 戳气球 每日一题 Golang 动态规划
最容易的想到的是递归求解,但是必然会造成大量的重复计算。那能不能利用动态规划拿空间换时间呢?
由于扎破一个气球后数组就发生了变化,不满足动态规划的无后效性。
到这里我陷入了困境。
看了题解的思路,真的太巧妙了,技巧性太强了。
题解的关键在于 倒过来考虑逐个戳破的气球。
我们在两边各加一个数值为1的气球。
我们构造dp矩阵,行列分别表示气球序列的起点和终点,dp[i][j]
表示戳破(i,j)
(注意为开区间)中的气球的最多得分。
1 | 3 | 1 | 5 | 8 | 1 | |
---|---|---|---|---|---|---|
1 | ||||||
3 | ||||||
1 | ||||||
5 | ||||||
8 | ||||||
1 |
结合示例用例来看,我们最终要求的是dp[0][5]
。
对于dp[i][j],(i,j)至少要包含一个气球,因此j>i+1。
1 | 3 | 1 | 5 | 8 | 1 | |
---|---|---|---|---|---|---|
1 | 0 | 0 |