https://www.hackerrank.com/challenges/sherlock-and-cost/problem
ref: Blog
위 수식을 최대화하는 를 구하면 된다. diff의 차이를 극대화하는 것이기 때문에 A[i]는 B[i]나 1이 되면 된다. 왜냐하면 이기 때문이다.
bfs, dfs를 통해 A[i]의 모든 가능성을 brute-force하게 검색할 수도 있지만 이기 때문에 time limit에 걸린다. Dynamic programming을 통해 S[i]를 계속 갱신하면서 최대 S[i]를 찾는다.
cost함수에서는 가장 큰 S의 요소를 반환하면 된다.
A[i]가 선택할 수 있는 값의 경우는 다음과 같다.
이러한 경우의 수는 A[i - 1] 또한 마찬가지이다.
S[i]를 일반화하면 다음과 같다.
이 때, A[i]의 경우의 수가 2가지이므로 A[i - 1]의 경우의 수도 2가지이다. 따라서 A[i]가 고정된 경우, S[i]에 대한 경우의 수는 2가지이다.
S[i]에서 선택할 수 있는 경우의 수는 다음과 같다.
위와 같은 점화식을 구성하면 S[i]에는 순차적으로 이전 정보들의 누적되면서 새로운 S[i]가 갱신된다.
https://github.com/naem1023/codingTest/blob/master/dp/hackerrank-sherlock-and-cost.py