434
社区成员
发帖
与我相关
我的任务
分享1.状态表示:
dp[i , j] 表示所有第i ~ j堆石子的合并方式,寻找这些方式中代价的最小值min。
2.状态转移方程:
对于计算一个区间[i , j]的最小消耗, 我们可以将其看成把两个小区间[i , k]和[k , j]合并的最小消耗,
即dp[i , j] = min(dp[i , j] , dp[i , k] + dp[k , j] + s[j] - s[i - 1])。 i<=k<j
问题答案: f[1][n]。
3.边界条件:
i==j时,dp[i][j]=0
4.时间、空间复杂度分析:
时间复杂度:
for(int len = 2; len <= n; len ++ ){
for(int i = 1; i + len - 1 <= n; i ++ ){
int l = i, r = i + len - 1;
dp[l][r] = INF;
for(int k = l; k < r; k ++ )
dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r] + s[r] - s[l - 1]);
}
}
使用三层循环,时间复杂度为O(n^3)
空间复杂度:
使用二维数组dp[n][n]来存储最小代价,空间复杂度为O(n^2)。
动态规划就是把一个复杂的问题划分成若干个子问题,再求解。主要用于求解以时间划分阶段的动态过程的优化问题。
有时候子问题会存在重复,可以把子问题存储下来,重复使用,减少重复计算。