mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-10 12:15:58 +08:00
Update
This commit is contained in:
35
problems/0300.最长上升子序列.md
Normal file
35
problems/0300.最长上升子序列.md
Normal file
@ -0,0 +1,35 @@
|
||||
|
||||
* dp[i]的定义
|
||||
|
||||
dp[i]表示i之前包括i的最长上升子序列。
|
||||
|
||||
|
||||
* dp[i]的初始化
|
||||
|
||||
每一个i,对应的dp[i](即最长上升子序列)起始大小至少是1.
|
||||
|
||||
|
||||
* 状态转移方程
|
||||
|
||||
|
||||
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
int lengthOfLIS(vector<int>& nums) {
|
||||
if (nums.size() <= 1) return nums.size();
|
||||
vector<int> dp(nums.size(), 1);
|
||||
int result = 0;
|
||||
for (int i = 1; i < nums.size(); i++) {
|
||||
for (int j = 0; j < i; j++) {
|
||||
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
|
||||
}
|
||||
if (dp[i] > result) result = dp[i]; // 取长的子序列
|
||||
//for (int j = 0 ; j < nums.size(); j++) cout << dp[j] << " ";
|
||||
//cout << endl;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
45
problems/0343.整数拆分.md
Normal file
45
problems/0343.整数拆分.md
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
// 拆成两个 还是拆成三个呢
|
||||
|
||||
# 思路
|
||||
|
||||
## 动态规划
|
||||
|
||||
* 明确dp[i]的含义
|
||||
|
||||
dp[i]表示 分拆数字i,可以得到的最大乘积。
|
||||
|
||||
* dp的初始化
|
||||
|
||||
初始化dp[i] = i,这里的初始化 不是为了让 i的最大乘积是dp[i],而是为了做递推公式的时候,dp[i]可以表示i这个数字,好用来做乘法。
|
||||
|
||||
* 递归公式
|
||||
|
||||
可以想 dp[i]的最大乘积是怎么得到的呢?
|
||||
|
||||
**一定是dp[j]的最大乘积 * dp[i - j]的最大乘积,那么只需要遍历一下j(取值范围[2,i-1)),取此时dp[i]的最大值就可以了**
|
||||
|
||||
递推公式:dp[i] = max(dp[i], dp[i - j] * dp[j]);
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
int integerBreak(int n) {
|
||||
if (n <= 3) return 1 * (n - 1); // 处理 2和3的情况
|
||||
int dp[60];
|
||||
for (int i = 0; i <= n; i++) dp[i] = i; // 初始化
|
||||
for (int i = 4; i <= n ; i++) {
|
||||
for (int j = 2; j < i - 1; j++) {
|
||||
dp[i] = max(dp[i], dp[i - j] * dp[j]);
|
||||
}
|
||||
}
|
||||
return dp[n];
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
# 贪心
|
||||
|
||||
本题也可以用贪心,但是真的需要数学证明证明其合理性,网上有很多贪心的代码,每次拆成3就可以了,代码很简单,大家如果感兴趣可以自己去查一查。
|
||||
|
||||
我这里就不做证明了。
|
@ -23,6 +23,12 @@
|
||||
|
||||
贪心在优先按照身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
|
||||
|
||||
局部最优:优先按照身高搞的people的k来插入。插入操作过后的people满足队列属性
|
||||
|
||||
全局最优:最后都做完插入操作,整个队列满足题目队列属性
|
||||
|
||||
局部最优可推出全局最优。
|
||||
|
||||
整个插入过程如下:
|
||||
|
||||
排序完:
|
||||
|
Reference in New Issue
Block a user