Advertisement
Fastrail08

Painting Fence 448C Codeforces

May 29th, 2025
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. //QUESTION - https://codeforces.com/problemset/problem/448/C
  2. // TODO - MEMO/DP..recursive solution written
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. void getMinimumStrokes(int level, long long strokes, long long &minStrokes, vector<int> &fence){
  7.     if(level >= fence.size()){
  8.      minStrokes = min(minStrokes, strokes);  
  9.      return;
  10.     }
  11.    
  12.     // If section is already painted, move to the next section
  13.     if(fence[level] == 0){
  14.         getMinimumStrokes(level + 1, strokes, minStrokes, fence);
  15.     }
  16.    
  17.     // Else we have 2 ways of painting (H, V);
  18.     else{
  19.         //horizontal stroke
  20.         int paintedTill = -1;
  21.         for(int i = level; i < fence.size(); i++){
  22.             if(fence[i] == 0){
  23.                 break;
  24.             }
  25.             paintedTill = i;
  26.             fence[i]--;
  27.         }
  28.         getMinimumStrokes(level, strokes + 1, minStrokes, fence);
  29.         // backtrack to previous state where horizontal stroke didn't happen
  30.         int actualRangePainted = paintedTill == -1 ? fence.size() - 1: paintedTill;
  31.             if(paintedTill != -1){
  32.                 for(int i = level; i <= paintedTill; i++){
  33.                 fence[i]++;
  34.             }
  35.         }
  36.        
  37.         //vertical stroke
  38.         int currUnpaintedFence = fence[level];
  39.         fence[level] = 0;
  40.         getMinimumStrokes(level + 1, strokes + 1, minStrokes, fence);
  41.         fence[level] = currUnpaintedFence;
  42.     }
  43. }
  44.  
  45. int main() {
  46.     // your code goes here
  47.     int n;
  48.     cin >> n;
  49.     vector<int> fence(n);
  50.     for(int i = 0; i < n; i++){
  51.         cin >> fence[i];
  52.     }
  53.     long long minStrokes = INT_MAX;
  54.     getMinimumStrokes(0, 0, minStrokes, fence);
  55.     cout << minStrokes << '\n';
  56. }
  57.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement