![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 90
Smoothzjc
SCAU 希望在CSDN上结识到更多志同道合的人!
展开
-
算法设计与分析 SCAU19184 传球游戏
### 一、深度优先搜索#### 解题思路搜索即将所有情况列出来,每传到一个同学手中时,他都有两种选择,一个是往左传,一个是往右传,我们只要计算传到最后一次时是否传回第一个人手中即可。类似于击鼓传花,只不过击鼓传花结束条件是**时间到了**,而这题的结束条件是**传的次数到了**。当传到 j 同学手中时,传过来的位置有两种情况,一种是从左边即 j - 1,一种是从右边即 j + 1,因此 a[i][j] = a[i - 1][j - 1] + a[i - 1][j + 1]但需要注意有特殊情况原创 2022-11-28 11:14:54 · 1308 阅读 · 0 评论 -
算法设计与分析 SCAU11090 最大m段乘积和最小m段和(优先做)
这个公式这样理解:当 j >= 2 && j原创 2022-11-24 15:56:34 · 500 阅读 · 0 评论 -
算法设计与分析 SCAU17089 最大m子段和
求 dp[ i ][ j ],有两种情况1. dp[ i ][ j ] = dp[ i ] [ j-1 ] + a[ j ] ,即把第 j 项融合到第 j-1 项的子段中,子段数没变(即跟前面连成一段,一般发生于前面的数是正数时);2. dp[ i ][ j ] = dp[ i-1 ] [ k ] + a[ j ],(i-1 对于第二点,思考方式可以是如下图:当你遍历到6这个元素时原创 2022-11-23 17:00:41 · 674 阅读 · 2 评论 -
算法设计与分析 SCAU8597 石子划分问题
dp[n][m] = dp[n - k][m - 1] + (a[n] - a[n - k + 1]) * (a[n] - a[n - k + 1])假设最后一份石头有 k 堆,则 dp[n][m] 为前 n - k 堆中挑选出 m - 1 份的得分,加上最后这一份的石头得分,得分为最后一堆减去第一堆的平方(因为已经升序排序,所以最大的在这一份最后,最小的一定在这一份开头)原创 2022-11-22 20:53:00 · 507 阅读 · 0 评论 -
算法设计与分析 SCAU8595 钱币组合的问题(优先做)
转移方程的过程:dp[i][sum] += dp[i - 1][sum - num * v[i]]:加上前 i 种纸币面值为 sum - num * v[i] 时的个数,由于 num 是会慢慢变大,即组合能容纳多张第 i 张纸币,因为可能会重复,所以是加上.也用一个状态转移方程来记录 paper[i][sum]: 记录到第 i 种纸币时,面值为 sum 的纸币最小张数原创 2022-11-16 10:40:03 · 459 阅读 · 0 评论 -
算法设计与分析 SCAU11078 不能移动的石子合并(优先做)
dp[l][r] 表示从 L 到 R 合并成一堆的最小代价对我感兴趣的小伙伴可查看以下链接公众号:Smooth前端成长记录。原创 2022-11-12 16:33:35 · 680 阅读 · 0 评论 -
算法设计与分析 SCAU19182 石子合并(基础版)
>此题 dp 思路是将所有区间以及需要的代价全部列出来,那么如何列出来呢?1. 对于 dp[l][r]:从 L 到 R 合并成一堆的最小代价,我们需要一个指针 mid,放在区间 [l, r] 中间,为什么需要这个 mid 呢?原创 2022-11-10 17:32:10 · 393 阅读 · 0 评论 -
算法设计与分析 SCAU11083 旅游背包(优先做)
dp[i][j][k] 表示从前 i 个物品中选,选出的总体积小于等于 j,总重量小于等于 k 的最优解。可以从 dp[1][1][1] = 0 开始遍历,有 n 个物品,需要 n 次遍历而在每件物品时都有 V 个容纳体积、W 个容纳重量可支配,再进行 V 和 W 次遍历(顺序可颠倒)。因此 dp[i][j][k] 不断由之前的状态更新而来。对我感兴趣的小伙伴可查看以下链接公众号:Smooth前端成长记录。原创 2022-11-06 16:08:42 · 646 阅读 · 0 评论 -
算法设计与分析 SCAU10303 数字三角(优先做)
1. 因为题目要求为:有多条路径,靠右的路径优先(即仅仅输出靠右的路径即可,无需多条路径都输出)。2. 所以此题若存在多条路径,如果按常规思路进行从上到下进行动态规划时,易出现**遍历到最后一行时,某一列为多条路径的最后终点**,而无法求出题目的第二要求:输出该路径上的数字。3. 所以我们可以换种方式:**逆向**求状态转移方程,即从下往上。好处是如果从上往下查看求完的 dp 数组,**不用到最后一行才知道路径值总和最大是哪个,而是从一开头就可以知道了**,因为从上往下沿着 dp 值大的那条路径往下遍历原创 2022-11-01 07:55:13 · 244 阅读 · 0 评论 -
算法设计与分析 SCAU19185 01背包问题 C++
我们将所有状态分为两类,第一类不含第 i 件物品,第二类含第 i 件物品,**取决于第 i 件物品体积是否大于当前背包所能容纳的大小**。例如:当前背包最大容纳量只有5,如果物品体积为7,那么很明显装不进来;**注意第二类只有在 v[i]原创 2022-10-31 10:03:23 · 518 阅读 · 0 评论 -
算法设计与分析 SCAU11077 最长公共子字符串(优先做)
假设字符串 text1 和 text2 的长度分别为 m 和 n,创建 m+1 行 n+1 列的二维数组 dp,其中 dp[i][j] 表示 text1[0, i] 和 text2[0, j] 的最长公共子字符串的长度。例如:dp[3][4] 代表 text1 字符串前三个字符和 text2 字符串前四个字符的最长公共子字符串的长度。对我感兴趣的小伙伴可查看以下链接公众号:Smooth前端成长记录。原创 2022-10-14 00:04:22 · 257 阅读 · 0 评论 -
算法设计与分析 SCAU8596 最长上升子序列(优先做)
当元素 ai1 < ai2 < ... < aiK. 就说这个序列是有序上升的。给定序列(a1, a2, ..., aN),存在许多这样的子序列(ai1, ai2, ..., aiK),其中1原创 2022-10-10 11:09:58 · 483 阅读 · 0 评论 -
算法设计与分析 SCAU11084 多个串的最长公共子序列
假设字符串 text1 和 text2 的长度分别为 m 和 n,创建 m+1 行 n+1 列的二维数组 dp,其中 dp[i][j] 表示 text1[0, i] 和 text2[0, j] 的最长公共子序列的长度。例如:dp[3][4] 代表 text1 字符串前三个字符和 text2 字符串前四个字符的最长公共子序列的长度。对我感兴趣的小伙伴可查看以下链接公众号:Smooth前端成长记录。原创 2022-10-13 18:05:29 · 644 阅读 · 1 评论