Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //QUESTION - https://codeforces.com/problemset/problem/448/C
- // TODO - MEMO/DP..recursive solution written
- #include <bits/stdc++.h>
- using namespace std;
- void getMinimumStrokes(int level, long long strokes, long long &minStrokes, vector<int> &fence){
- if(level >= fence.size()){
- minStrokes = min(minStrokes, strokes);
- return;
- }
- // If section is already painted, move to the next section
- if(fence[level] == 0){
- getMinimumStrokes(level + 1, strokes, minStrokes, fence);
- }
- // Else we have 2 ways of painting (H, V);
- else{
- //horizontal stroke
- int paintedTill = -1;
- for(int i = level; i < fence.size(); i++){
- if(fence[i] == 0){
- break;
- }
- paintedTill = i;
- fence[i]--;
- }
- getMinimumStrokes(level, strokes + 1, minStrokes, fence);
- // backtrack to previous state where horizontal stroke didn't happen
- int actualRangePainted = paintedTill == -1 ? fence.size() - 1: paintedTill;
- if(paintedTill != -1){
- for(int i = level; i <= paintedTill; i++){
- fence[i]++;
- }
- }
- //vertical stroke
- int currUnpaintedFence = fence[level];
- fence[level] = 0;
- getMinimumStrokes(level + 1, strokes + 1, minStrokes, fence);
- fence[level] = currUnpaintedFence;
- }
- }
- int main() {
- // your code goes here
- int n;
- cin >> n;
- vector<int> fence(n);
- for(int i = 0; i < n; i++){
- cin >> fence[i];
- }
- long long minStrokes = INT_MAX;
- getMinimumStrokes(0, 0, minStrokes, fence);
- cout << minStrokes << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement