算法设计与分析第三章作业

计科2101王语欢 2022-11-13 16:46:12

一、合并石子

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)。

二、对动态规划的体会和思考

          动态规划就是把一个复杂的问题划分成若干个子问题,再求解。主要用于求解以时间划分阶段的动态过程的优化问题。

有时候子问题会存在重复,可以把子问题存储下来,重复使用,减少重复计算。

 

...全文
44 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧