#动态规划两道题
1043. 分隔数组以得到最大和 - 力扣(LeetCode)
方法一(过不了):树状数组+dfs
用dfs暴力搜索时间复杂度为指数型,用树状数组优化,但还是指数型
介绍一下树状数组:
【五分钟丝滑动画讲解 | 树状数组】 https://www.bilibili.com/video/BV1ce411u7qP/?share_source=copy_web&vd_source=c9899d0504fa271ca6db5ef82d1a6bbb
树状数组的作用,
1.以O(logN)找到一个下表的 i 到 j 的和
2.以O(logN)更新一个下表的数字
3.空间复杂度为O(N)
1 | |
方法二:dp
简单分析一下找到数组的最大值,就是找到n的位置于n的前k项进行组合找到最大值
dp中储存的就是当前下表大小的数组的和最大值
推出动态方程 dp[i] = max(dp[i],dp[j]+valmax*(i-j));
1 | |
时间复杂度O(NK) 空间是O(N)
368. 最大整除子集 - 力扣(LeetCode)
dp+数学(简单的数学):
数学方面就是:在一个集合中使各个元素的最大公因数,最小公倍数是两个数本身
也就是说一个数能被另一个数整除
一个大于集合的所有数判断是否能被集合中所有元素整除,只需要判断能被集合中最大的数整除
所以先对nums排序
dp方程为dp[i] = max(dp[j]+1);
保存最大的值,从最大的值开始往前找,找到连续可行的子序列
1 | |
时间复杂度O(N^2)
空间复杂度O(2N)