文章目录
- 1049.最后一块石头的重量II
- 思路:
- 动归五部曲
- 代码:
- ● 494. 目标和
- 思路
- 五部曲1.确定dp数组
- 五部曲2.确定dp公式
- 3.dp初始化
- 4.遍历顺序
- 代码:
- ● 474.一和零
- 思路
- 动归五部曲
- 代码:
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];}
}