YazdanFC's blog

By YazdanFC, history, 5 months ago, In English

Introduction

Dynamic Programming (DP) is a powerful tool in competitive programming, but it can be tricky to master. In this blog, we’ll go through 5 essential DP tricks that can make even the hardest problems manageable. Each trick comes with a clear example and a Codeforces problem so you can practice immediately.

1-Prefix and Suffix DP

Avoid recalculating the same subproblems by maintaining prefix or suffix arrays.

Example: Calculate sum of any subarray in O(1) using prefix sums.

vector<int> prefix(n+1, 0);
for(int i = 0; i < n; i++) {
    prefix[i+1] = prefix[i] + arr[i];
}
int sum = prefix[r+1] - prefix[l]; // sum of subarray [l, r]

Tip: Precompute cumulative results to reduce repetitive calculations.

2-DP on Trees

When working with trees, standard DP often fails. Use DFS + DP to store subtree results.

void dfs(int u, int parent) {
    dp[u] = value[u];
    for(int v : adj[u]) if(v != parent) {
        dfs(v, u);
        dp[u] += max(0, dp[v]);
    }
}

Pro Tip: Decide if you need downward or upward DP values.

3-Bitmask DP

Useful for subset problems (like TSP). Represent subsets as integers and store the optimal solution.

for(int mask = 0; mask < (1<<n); mask++) {
    for(int i = 0; i < n; i++) if(!(mask & (1<<i))) {
        DP[mask | (1<<i)] = min(DP[mask | (1<<i)], DP[mask] + cost[i]);
    }
}

4-Space Optimization

Reduce O(n²) DP space to O(n) by keeping only the previous row.

vector<int> prev(n+1, 0), curr(n+1, 0);
for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= n; j++) {
        curr[j] = max(prev[j], prev[j-1] + arr[i]);
    }
    prev = curr;
}

5-Sliding Window / Monotonic Queue DP

When DP depends on the previous k states, use a sliding window or monotonic queue to optimize.

deque<int> q;
for(int i = 0; i < n; i++) {
    while(!q.empty() && q.front() < i-k) q.pop_front();
    dp[i] = dp[q.front()] + arr[i];
    while(!q.empty() && dp[i] > dp[q.back()]) q.pop_back();
    q.push_back(i);
}

Conclusion

Mastering these 5 DP tricks will make you faster and more confident in contests. Don’t just read—practice! Try the problems and implement the solutions without peeking.

Challenge: Can you combine Bitmask DP with Tree DP? Try it in your next contest and share your results in the comments!

  • Vote: I like it
  • -52
  • Vote: I do not like it

»
5 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by YazdanFC (previous revision, new revision, compare).

»
5 months ago, hide # |
 
Vote: I like it +16 Vote: I do not like it

just stop generating those ai blogs

»
5 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

ppl be posting ANYTHING just to farm some contribution

  • »
    »
    5 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    Just to clarify, this blog is entirely my own work, based on my personal experience in CF contests. All the code and explanations are original, not random posts to farm contribution—even though my contribution is -30. I hope you still find some of the tips useful!