1049. 最后一块石头的重量 II
题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m+1][n+1];
for(int i = 0; i < strs.length; ++i) {
int nums0 = 0;
int nums1 = 0;
for(int x = 0; x < strs[i].length(); ++x) {
if(strs[i].charAt(x) == '0') {
++nums0;
}else {
++nums1;
}
}
for(int j = m; j >= nums0; --j) {
for(int k = n; k >= nums1; --k) {
dp[j][k] = Math.max(dp[j][k], dp[j-nums0][k-nums1] + 1);
}
}
}
return dp[m][n];
}
}
494. 目标和
方法一回溯:
class Solution {
int ret = 0;
public int findTargetSumWays(int[] nums, int target) {
backtrack(nums, target, 0, 0);
return ret;
}
private void backtrack(int[] nums, int target, int index, int sum) {
if (index == nums.length) {
if (sum == target) {
++ret;
}
return;
}
backtrack(nums, target, index + 1, sum + nums[index]);
backtrack(nums, target, index + 1, sum - nums[index]);
}
}
方法二动规:
class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
target = target < 0 ? -target : target;
for(int i = 0; i < nums.length; ++i) {
sum += nums[i];
}
if((target + sum) % 2 == 1) {
return 0;
}
int n = (target + sum) / 2;
int[] dp = new int[n + 1];
dp[0] = 1;
for(int i = 0; i < nums.length; ++i) {
for(int j = n; j >= nums[i]; --j) {
dp[j] += dp[j - nums[i]];
}
}
return dp[n];
}
}
474.一和零
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m+1][n+1];
for(int i = 0; i < strs.length; ++i) {
int nums0 = 0;
int nums1 = 0;
for(int x = 0; x < strs[i].length(); ++x) {
if(strs[i].charAt(x) == '0') {
++nums0;
}else {
++nums1;
}
}
for(int j = m; j >= nums0; --j) {
for(int k = n; k >= nums1; --k) {
dp[j][k] = Math.max(dp[j][k], dp[j-nums0][k-nums1] + 1);
}
}
}
return dp[m][n];
}
}