LeetCode(1262):3つで割り切れる最大およびGreatest Sum Divisible by Three(Java)
7427 ワード
2019.11.24 LeetCodeゼロブラシ個人ノートから整理(継続更新)
github:https://github.com/ChopinXBP/LeetCode-Babel
初めての週の試合で、最後にこの01リュックの問題を完全に作らなかったが、その鍵は初期値の設定にある.
dp配列が確立され、dp[i][j]はi番目のビット数(num[i−1])モード3の残数jの最大累積和を表す.
i=0の場合の初期値は{0,−INT,−INT}であり、1番目の数字numが3の倍数であればdp={num,−INT,−INT};そうでなければdp={0,num,−INT}/{0,−INT,num}となる.
i番目のビット数(num[i−1])を使用して、前回の合計となる新しいモード値newmod=(oldmod+num[i−1])%3を計算します.最新の累積と01リュックの構想を通じて動的移動方程式を確立することができる.
トランスポートゲート:3つで割り切れる最大和
Given an array nums of integers, we need to find the maximum possible sum of elements of the array such that it is divisible by three.
整数配列numsをあげます.3で割り切れる要素の最大和を見つけて返してください.
#Coding 1時間、Copying 1秒.いいねを残してくれてありがとう
github:https://github.com/ChopinXBP/LeetCode-Babel
初めての週の試合で、最後にこの01リュックの問題を完全に作らなかったが、その鍵は初期値の設定にある.
dp配列が確立され、dp[i][j]はi番目のビット数(num[i−1])モード3の残数jの最大累積和を表す.
i=0の場合の初期値は{0,−INT,−INT}であり、1番目の数字numが3の倍数であればdp={num,−INT,−INT};そうでなければdp={0,num,−INT}/{0,−INT,num}となる.
i番目のビット数(num[i−1])を使用して、前回の合計となる新しいモード値newmod=(oldmod+num[i−1])%3を計算します.最新の累積と01リュックの構想を通じて動的移動方程式を確立することができる.
dp[i][newmod] = Math.max(dp[i-1][newmod], dp[i-1][oldmod] + nums[i-1]);
トランスポートゲート:3つで割り切れる最大和
Given an array nums of integers, we need to find the maximum possible sum of elements of the array such that it is divisible by three.
整数配列numsをあげます.3で割り切れる要素の最大和を見つけて返してください.
1:
:nums = [3,6,5,1,8]
:18
: 3, 6, 1 8, 18( 3 )。
2:
:nums = [4]
:0
:4 3 , , 0。
3:
:nums = [1,2,3,4,4]
:12
: 1, 3, 4 4, 12( 3 )。
:
1 <= nums.length <= 4 * 10^4
1 <= nums[i] <= 10^4
import java.util.Arrays;
/**
*
* 5265.
* nums, 。
*
*/
public class GreatestSumDivisibleByThree {
//01
public int maxSumDivThree(int[] nums) {
//dp[i][j] i (num[i-1]) 3 j
//i=0 {0,-INT,-INT}, 1 num 3 , dp={num,-INT,-INT}; , dp={0,num,-INT}/{0,-INT,num}
int[][] dp = new int[nums.length + 1][3];
for(int[] list : dp){
Arrays.fill(list, Integer.MIN_VALUE);
}
dp[0][0] = 0;
for(int i = 1; i <= nums.length; i++){
// i (num[i-1]), newmod=(oldmod+num[i-1])%3
// 01
//dp[i][newmod] = Math.max(dp[i-1][newmod], dp[i-1][oldmod] + nums[i-1]);
for(int j = 0; j < 3; j++){
int mod = (j + nums[i - 1]) % 3;
dp[i][mod] = Math.max(dp[i - 1][mod], dp[i - 1][j] + nums[i - 1]);
}
}
return dp[nums.length][0];
}
}
#Coding 1時間、Copying 1秒.いいねを残してくれてありがとう