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!








Auto comment: topic has been updated by YazdanFC (previous revision, new revision, compare).
just stop generating those ai blogs
whomadewho Just to clarify, I wrote this blog myself.
All code and explanations are my own work—no AI involved.
—
ppl be posting ANYTHING just to farm some contribution
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!