나는 최근에이 질문에 부딪쳤다 : " 'true', 'false', 'and', 'or', 'xor'기호로 구성된 부울식이 주어집니다. 예를 들어 'true와 false xor true'를 괄호로 묶어 true로 평가하는 두 가지 방법이 있습니다. "
나는 그것이 동적 프로그래밍 문제라는 것을 알았으므로 다음과 같은 해결책을 스스로 시도했다. ABC .... D 여기서 '.'라는 표현이 있다고 가정합니다. x는 모든 연산을 나타내고 xor 및 대문자는 true 또는 false를 나타냅니다. 크기 K의이 표현식이 true를 생성하는 방법의 수는 N이라고하자. 새로운 부울 값 E가이 표현식에 추가 될 때이 새로운 표현식 1을 괄호로 묶는 두 가지 방법이 있습니다. ((ABC .... D) 즉) ABC .... D의 가능한 모든 괄호를 사용하여 끝에 E를 추가합니다. 2. (ABC (DE)) 즉. DE를 먼저 평가 한 다음이 K 크기 표현이 참을 수있는 방법의 수를 찾으십시오.
T [K]가 크기 K를 갖는 표현식이 true를 생성하는 방법의 수라고 가정하고 T [k] = val1 + val2 + val3 (val1, val2, val3)는 다음과 같이 계산됩니다.
1) E가 D와 그룹화 될 때
i) D의 값을 변경하지 않습니다
ii) D의 값을 반대로한다
첫 번째 경우 val1 = T [K] = N. (이것은 초기 ABC ... D 식으로 줄어듦). 두 번째 경우에는 D의 값이 반전되고 val1 인 dp [K]를 다시 평가하십시오.
2) E가 전체 표현으로 그룹화되는 경우.
// val2는 'true'의 개수를 포함합니다. E는 괄호로 묶은 ABC의 모든 인스턴스 중에서 'true'를 제공하는 표현식으로 생성합니다 ....... i) true 인 경우 E. true, val2 = N
ii) true.E = false 인 경우 val2 = 0
// val3에는 'true'가 포함되어 있습니다. E는 괄호로 묶은 ABC의 모든 인스턴스 중에서 'false'를 제공하는 표현식으로 생성합니다 ....... D
iii) false.E = true 인 경우 val3 = (2 ^ (K-2)-N) = M. 크기 K를 가진 표현식이 거짓을 생성하는 방법의 수 [2 ^ (K-2)는 크기 K의 표현식을 괄호로 묶는 방법의 수입니다].
iv) false.E = false 인 경우 val3 = 0
이것은 내가 생각한 기본 아이디어이지만 솔루션 http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf를 확인했을 때 의 접근법은 완전히 다릅니다. 누군가 내가 뭘 잘못하고 있는지, 어떻게 DP를 해결할 때 어떻게 나아질 수 있습니까?
미리 감사드립니다.
true and (false xor true) = (true and false) xor true
(둘 다로 줄이면 쉽게 볼 수 있음false xor true
).