Advertisement
mickypinata

GRD3-T18: Wood Cutter

Nov 27th, 2020
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int L = 1000;
  5. const int C = 50;
  6.  
  7. int cut[C + 1], dp[L + 1][L + 1];
  8. int len, nCut;
  9.  
  10. int dpTopDown(int l, int r){
  11.     int *upb = lower_bound(cut + 1, cut + nCut + 1, r) - 1;
  12.     int *lwb = lower_bound(cut + 1, cut + nCut + 1, l);
  13.     if(lwb > upb){
  14.         return 0;
  15.     }
  16.     if(dp[l][r] != 0){
  17.         return dp[l][r];
  18.     }
  19.     int mn = 1e9;
  20.     for(int *ptr = lwb; ptr <= upb; ++ptr){
  21.         mn = min(mn, dpTopDown(l, *ptr) + dpTopDown(*ptr + 1, r));
  22.     }
  23.     return dp[l][r] = r - l + 1 + mn;
  24. }
  25.  
  26. int main(){
  27.  
  28.     scanf("%d %d", &len, &nCut);
  29.     for(int i = 1; i <= nCut; ++i){
  30.         scanf("%d", &cut[i]);
  31.     }
  32.  
  33.     cout << dpTopDown(1, len);
  34.  
  35.     return 0;
  36. }
  37.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement