\[ \let\oldlor\lor \renewcommand{\lor}{\; \oldlor \;} \let\oldland\land \renewcommand{\land}{\; \oldland \;} \renewcommand{\set}[1]{\{\, #1 \,\}} \renewcommand{\given}{\,\mid\,} \renewcommand{\abs}[1]{\lvert #1 \rvert} \renewcommand{\divs}{\!\;\mid\;\!} \renewcommand{\ndivs}{\!\;\nmid\;\!} \renewcommand{\betw}[3][1]{#1 \leq #2 \leq #3} \renewcommand{\mod}[1]{\ (\mathrm{mod}\ #1)} \renewcommand{\floor}[1]{\left \lfloor #1 \right \rfloor} \renewcommand{\ceil}[1]{\left \lceil #1 \right \rceil} \renewcommand{\t}[1]{\texttt{#1}} \renewcommand{\fori}[2][i]{\text{for } #1 = 0, 1, \dots, #2} \renewcommand{\x}[1]{\text{#1}} \renewcommand\concat{\mathbin{+\mkern-10mu+}} \DeclareMathOperator*{\CONCAT}{\concat} \DeclareMathOperator*{\SCC}{\|} \]
CodeForces 455A - Boredom
View on CodeForces

This is a good example for a short discussion on dynamic programming. DP solutions should be very formulaic and clear. It helps to practice some structure around your implementation to make coming up with a solution easier. You will almost always have certain key elements in your dp-implementation:

  • Recurrence relation
  • Memoization table

The table is necessary to store the result of each call when it completes the first time, and retrieved from memory each time thereafter.Recurrence relation, defining the sequence as a recursive function of itself and some stop condition or base case. Usually you want the arguments of your function to relate directly to the indices your memoization table.

For example, if we are computing the fibonacci sequence with a top-down memoization strategy, our recurrence is $\t{fib(n) = fib(n-1) + fib(n-2)}$ , and our memoization table is $\t{int dp[MAX_N];}$ where $\t{dp[i] = fib(i)}$ once computed.

Formulating the recurrence relation is the only challenging part of dynamic programming problems. But once you have the recurrence defined the rest should be so routine that it's easy. You should be tell me, in plain English, what your DP function does. By that, I mean if your DP function is:

then your explanation should be "$\t{minimax_nim(n, is_first_turn)}$ is the winner of the Nim game when there is n items left and it is player 1's turn next if $\t{is_first_turn}$ is true, otherwise player 2's turn next".

Links

CodeForces

1A Theatre Square
4A Watermelon
25A IQ test
50A Domino piling
58A Chat room
59A Word
69A Young Physicist
71A Way Too Long Words
96A Football
112A Petya and Strings
118A String Task
131A cAPS lOCK
158A Next Round
189A Cut Ribbon
230B T-primes
231A Team
263A Beautiful Matrix
281A Word Capitalization
282A Bit++
318A Even Odds
339A Helpful Maths
339B Xenia and Ringroad
455A Boredom
459B Pashmak and Flowers
474B Worms
479A Expression
486A Calculating Function
489B BerSU Ball
489C Given Length and Sum of Digits...
492B Vanya and Lanterns
500A New Year Transportation
507B Amr and Pins
513A Game
520B Two Buttons
550A Two Substrings
580A Kefa and First Steps
742A Arpa's hard exam and Mehrdad's naive cheat
766B Mahmoud and a Triangle
935A Fafa and his Company
977B Two-gram
977D Divide by three, multiply by two
996A Hit the Lottery
1097A Gennady and a Card Game
1108A Two distinct points
1154A Restoring Three Numbers

UVa

230 Borrowers
543 Goldbach's Conjecture
900 Brick Wall Patterns
10047 The Monocycle
10140 Prime Distance
10165 Stone Game
10338 Mischievous Children
10394 Twin Primes
10892 LCM Cardinality