#javascript #algorithm #dynamic-programming
#javascript #алгоритм #динамическое программирование
Вопрос:
решение последнего камня весом 2 в cpp
Это позволяет пройти все тестовые случаи.
class Solution {
public:
int lastStoneWeightII(vector<int>amp; stones) {
int n = stones.size();
int total = 0;
for(int i = 0; i < n; i ){
total = stones[i];
}
int req = total / 2;
vector <bool> dp(req 1, false);
dp[0] = true;
int reach = 0;
for(int i = 0; i < n; i ){
for(int j = req; j - stones[i] >= 0; j--){
dp[j] = dp[j] || dp[j - stones[i]];
if(dp[j]) reach = max(reach, j);
}
}
return total - (2 * reach);
}
};
Я попытался воспроизвести его в javascript и не смог передать
простые тестовые примеры, такие как [2,7,4,1,8,1]
Вот моя попытка
var lastStoneWeightII = function(st) {
// stone #
const n = st.length;
// sum up
const sum = st.reduce((acc, curr) => {return acc curr});
// e.g. half
const ha = Math.floor(sum / 2);
// half 1
const dp = Array(ha 1).fill(false);
// 1st ele = true
dp[0] = true;
// store tmp_max
let max = 0;
// loop element
for(let i=0; i<n; i ) {
// single element
const w = n[i];
// backward, half
for(let j=ha; j-w>=0; j--) {
// update condi
dp[j] = dp[j] || dp[j-w];
// never comes in
if(dp[j]) {
//test
console.log(' max', max, 'j', j)
max = Math.max(max, j);
}
}
}
return (sum - max) - max;
}
Комментарии:
1. вы проверили, что вы написали? передавайте строку за строкой, и вы увидите разницу (удивлен, что
const w = n[i];
компилируется, так какn
это длина массива …)2. В ссылке:
So for example, if the input is like [2,7,4,1,8,1], then the output will be 1. This is because if we smash (2,4), then the new array will be [2,7,1,8,1], them smash (7,8), the new array will be [2,1,1,1], then smash (2,1), the array will be [1,1,1], after that smash (1,1), so only 1 will be there.
неубедительно (нет определения порядка разбиения): если мы пойдем «по порядку», [2,7,4,1,8,1], (2,7)->(5)->[5,4,1,8,1], (5,4)->(1)->[1,1,8,1], (1,1)->()->[8,1], (8,1)->(7)->[7]-> там будет только 7…