312. Burst Balloons
题目理解:
给出一串气球, 每炸裂一个气球会有 left*right*itself
的得分, 同时气球消失, 找出炸裂这一串气球能获得的最大分数
思路:
用 f[i][j]
记录状态, 表示在其他气球完好的情况下, 炸裂[i, j]气球的最大得分;
所以问题的答案就是 f[sqrt(n)][n]
要写出状态转移方程要考虑的问题: 假设[i,j]中除了 f[i][j]
, 其他例如 f[i+1][j]
, f[i][j-1]
之类的子问题都求出来了, 如何求 f[i][j]
呢
可以将[i,j]分为三部分: [i,k-1], [k,k], [k+1, j], 前后两部分的得分由 f[i][k-1]
和 f[k+1][j]
算出, 根据 f[i][j]
的定义, 剩下的[k,k], 前后的气球都炸裂了, 所以 f[k,k]
为 point(i-1)*point(k)*point(j+1)
这样就能够写出状态转移方程 f[i][j] = max(i<=k<=j){ f[i][k-1] + f[k+1][j] + p(i-1)*p(k)*p(j+1) }
我最终实现的时候使用了递归, 当然是记忆化的递归, 不过看起来效率还是挺低的, 好处就是编程难度较低; 初始状态需要算每个 f[i][i]
;
小结:
这道题明显是矩阵乘法的变种, 最初在想状态转移方程的时候想了挺多, 这个过程蛮艰难的
Submission Detail:
code:
1 |
|