今日任务
1049. 最后一块石头的重量
- 题目链接: https://leetcode.cn/problems/last-stone-weight-ii/description/
- 题目描述:
Code
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = reduce(stones.begin(), stones.end(), 0);
int n = stones.size();
int target = sum / 2;
// 记忆化搜索
// vector<vector<int>> memo(n, vector<int>(sum + 1, -1));
// function<int(int, int)> dfs = [&](int i, int c)->int{
// if(i < 0){
// return 0;
// }
// int & res = memo[i][c];
// if(res != -1){
// return res;
// }
// if(c < stones[i]){
// return res = dfs(i - 1, c);
// }
// return res = max(dfs(i - 1, c), dfs(i - 1, c - stones[i]) + stones[i]);
// };
// return sum - 2 * dfs(n - 1, target);
// 递推
vector<int> dp(target + 1);
for(auto & x : stones){
for(int c = target; c >= x; c--){
dp[c] = max(dp[c], dp[c - x] + x);
}
}
return sum - 2 * dp[target];
}
};
494. 目标和
- 题目链接: https://leetcode.cn/problems/target-sum/description/
- 题目描述:
Code
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
// p
// s - p
// p - (s - p) = target
// p = (s + target) / 2
target += reduce(nums.begin(), nums.end(), 0);
if(target < 0 || target % 2){
return 0;
}
target /= 2;
int n = nums.size();
// 记忆化搜索
// vector<vector<int>> memo(n, vector<int>(target + 1, -1));
// function<int(int, int)> dfs = [&](int i, int c)->int{
// if(i < 0){
// return c == 0 ? 1 : 0;
// }
// int &res = memo[i][c];
// if(res != -1){
// return res;
// }
// if(c < nums[i]){
// return res = dfs(i - 1, c);
// }
// return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]);
// };
// return dfs(n - 1, target);
// 递推
// f[i + 1][c] = f[i][c] + f[i][c - nums[i]]
// vector<vector<int>> dp(n + 1, vector<int>(target + 1));
// dp[0][0] = 1;
// for(int i = 0; i < n; i++){
// for(int j = 0; j <= target; j++){
// if(j < nums[i]){
// dp[i + 1][j] = dp[i][j];
// }else{
// dp[i + 1][j] = dp[i][j] + dp[i][j - nums[i]];
// }
// }
// }
// return dp[n][target];
// 优化
// vector<vector<int>> dp(2, vector<int>(target + 1));
// dp[0][0] = 1;
// for(int i = 0; i < n; i++){
// for(int j = 0; j <= target; j++){
// if(j < nums[i]){
// dp[(i + 1) % 2][j] = dp[i % 2][j];
// }else{
// dp[(i + 1) % 2][j] = dp[i % 2][j] + dp[i % 2][j - nums[i]];
// }
// }
// }
// return dp[n % 2][target];
// 一维
vector<int> dp(target + 1);
dp[0] = 1;
for(auto &x : nums){
for(int j = target; j >= x; j--){
dp[j] += dp[j - x];
}
}
return dp[target];
}
};
474.一和零
- 题目链接: https://leetcode.cn/problems/ones-and-zeroes/description/
- 题目描述:
Code
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
// dfs(i, m, n) = max(dfs(i - 1, m, n), dfs(i - 1, m - ranges::count(strs[i], '0'), n - ...) + 1)
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for(auto & str : strs){
int x = ranges::count(str, '0');
int y = str.size() - x;
for(int i = m; i >= x; i--){
for(int j = n; j >= y; j--){
dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);
}
}
}
return dp[m][n];
}
};