하자 f(i,len,k,state)
len
는 현재 시퀀스 길이 i
인덱스, 최대 최소의 서열을 나타내고, 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
자바 스크립트 코드 : // 메타 : [합의보기를 참조하시기 바랍니다] (HTTPS,이 플래그 얻을 찾고 사용자의
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
. 스택 오버플로.co.kr/a/278808/1079354)를 참조하십시오. 다른 사이트의 도덕적 코드를 기반으로하지 않고 제시된대로 자질에 따라이 질문을 판단하십시오. – Makoto