[Algorithm Champions] Week 4, No.3
9103 ワード
質問する
に答える
これは隣接しない数値を加算した最大値を返す問題です.
点火式を確立し,dpで問題を解く.
arrayの上部を回って確認します.
新しいシナリオb
b[0]=75(最大値のため)
b[1]=max(a[0],a[1])=105(2つの値のうち1つしか選択できない大きな値)
b[2]=max(b[0]+a[2],b[1])=195(すなわち、前の値(b[1])が大きく、前の2つの値に現在の値(b[0]+a[2])を加え、後の値を比較すると大きくなり、現在195を値に加算する.)
...
(上記のように)
コード#コード#
package com.company.w4;
/*
date: 21.07.07 21:03 ~ 21:47
input: int array
output: int
constraints: input val - positive integer
인접하지 않은 원소들을 더한 최대 값을 반환
edge cases:
array is empty -> return 0
array.length == 1 -> return array[0]
Brute force
data structure: array
algorithm: traversal
[75, 105, 120, 75, 90, 135]
for문 2번 돌기
sum1 = 75 + max(120,75) -> 120 + max(90, 135) -> 135 = 75 + 120 + 135 = 330
sum2 = 105 + max(75,90) -> 90
105 + 75 + 135
맨 뒤 a[5] 선택될 경우 -> a[4]=90 x, max(120,75)
a[4] -> a[3]=75 x, max(105, 120)
0 ~ 5
// 본인 포함
b[0] = 75
b[1]= 105
b[2]=b[0]+ a[2] = 195
b[3]=b[1]+a[3] = 180
b[4]=b[2]+a[4] = 285
b[5]=b[3]+a[5] = 315
// 본인 미포함
b[0] = a[0] = 75
b[1] = max(a[0],[a1]) = 105
b[2] = max(b[0] + a[2], b[1]) = 195
b[3] = max(b[1] + a[3], b[2]) = 105 + 75 < 195 = 195
b[4] = max(b[2] + a[4], b[3]) = 195 + 90 > 195 = 285
b[5] = max(b[3] + a[5], b[4]) = 195 + 135 > 285 = 330
*/
// time: O(N), space: O(N)
public class No3 {
public static void main(String[] args) {
int[] array = {75, 105, 120, 75, 90, 135};
System.out.println(maxSubsetSum(array));
}
public static int maxSubsetSum(int[] array) {
// base case
if (array.length == 0) return 0;
if (array.length == 1) return array[0];
int[] maxArray = new int[array.length];
maxArray[0] = array[0];
maxArray[1] = Math.max(array[0], array[1]);
for (int i = 2; i < maxArray.length; i++) {
if (maxArray[i - 2] + array[i] > maxArray[i - 1]) {
maxArray[i] = maxArray[i - 2] + array[i];
} else {
maxArray[i] = maxArray[i - 1];
}
}
return maxArray[maxArray.length - 1];
}
}
Reference
この問題について([Algorithm Champions] Week 4, No.3), 我々は、より多くの情報をここで見つけました https://velog.io/@ffwang/Algorithm-Champions-Week-4-No.3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol