文章目录
1049.最后一块石头的重量II
思路:
动归五部曲
代码:
class Solution {
public int lastStoneWeightII(int[] stones) {
int n = stones.length;
int sum = 0;
for(int num:stones){
sum += num;
}
int target=sum/2;
int[] dp=new int[target+1];
for(int i=0;i<n;i++){
for(int j=target;j>=stones[i];j--){
dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);
}
}
return sum-dp[target]-dp[target];
}
}
● 494. 目标和
思路
五部曲1.确定dp数组
因为加法总和x一定为整数
.
五部曲2.确定dp公式
3.dp初始化
4.遍历顺序
代码:
记得考虑target>sum 或者-target>sum,或者left(left=(t+S)/2)不为整数的情况
初始化dp[0]为1
class Solution {
public int findTargetSumWays(int[] nums, int target) {
// 加法为x 减法为sum-x 则x-(sum-x)=target. x=(sum+target)/2 且x为非负整数
int sum=0;
for(int i:nums)sum+=i;
if(Math.abs(target)>sum||(target+sum)%2!=0)return 0;
int left=(target+sum)/2;
int[] dp=new int[left+1];
dp[0]=1;
for(int i=0;i<nums.length;i++){
for(int j=left;j>=nums[i];j--){
dp[j]+=dp[j-nums[i]];
}
}
return dp[left];
}
}
● 474.一和零
思路
动归五部曲
代码:
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp=new int[m+1][n+1];
int zero_num;
int one_num;
for(String s:strs){//物品
one_num = 0;
zero_num = 0;
for(char ch:s.toCharArray()){
if(ch=='0'){
zero_num++;
}else{
one_num++;
}
}
// 这里i,j都属于重量,应该倒序
for(int i=m;i>=zero_num;i--){
for(int j=n;j>=one_num;j--){
dp[i][j]=Math.max(dp[i][j],dp[i-zero_num][j-one_num]+1);
}
}
}
return dp[m][n];
}
}