讓f(i,len,k,state)
代表最小序列高達索引i
,其中len
是當前序列長度,k
是迄今爲止翻轉的數量和state
是a[i]
狀態。
然後:
if a[i] == 0:
// starting a new sequence
f(i, 1, k, 0) = min(f(i-1, len, k, 1) for all len)
// adding to a sequence (len > 1)
f(i, len, k, 0) = max(len, f(i-1, len-1, k, 0))
// starting a new sequence
f(i, 1, k, 1) = min(f(i-1, len, k-1, 0) for all len)
// adding to a sequence (len > 1)
f(i, len, k, 1) = max(len, f(i-1, len-1, k-1, 1))
if a[i] == 1:
...left as an exercise
JavaScript代碼:
function f(a,i,len,k,state){
// We cannot change the state of a[i] if k is zero
if (k === 0 && a[i] != state)
return Infinity;
// The first element is a sequence of length 1
if (i === 0)
return 1;
var oppositeState = state == 0 ? 1 : 0;
if (a[i] == state){
// Starting a new sequence
if (len === 1){
var best = Infinity;
for (var l=1; l<i+1; l++)
best = Math.min(best, f(a, i-1, l, k, oppositeState));
return best;
// Adding to a sequence (len > 1)
} else {
return Math.max(len, f(a, i-1, len-1, k, state));
}
// a[i] does not equal state
} else if (k > 0) {
// Starting a new sequence
if (len === 1){
var best = Infinity;
for (var l=1; l<i+1; l++)
best = Math.min(best, f(a, i-1, l, k-1, oppositeState));
return best;
// Adding to a sequence (len > 1)
} else {
return Math.max(len, f(a, i-1, len-1, k-1, state));
}
// If k is zero, we cannot change the state of a[i]
} else {
return Infinity;
}
}
function g(arr,k){
var best = Infinity;
for (var l=1; l<=2*arr.length; l++)
best = Math.min(best, f(arr, arr.length-1, Math.ceil(l/2), k, l % 2));
return best;
}
console.log(g('110001111',2)); // 2
console.log(g('1001',1)); // 2
console.log(g('111111',0)); // 6
對於用戶希望得到這個標記,[請閱讀一致的意見(https://開頭元。堆棧溢出。com/a/278808/1079354)對與積極競賽相關的問題進行討論。只根據其提交的質量來判斷這個問題,而不是基於其他網站的道德準則。 – Makoto