YEZAELP

CUBE-180: Destruction

Apr 25th, 2021 (edited)
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. const int N = 5e4;
  6. const lli INF = 2e18;
  7. int n, k, m;
  8. lli qs[N+10];
  9. lli mn[N+10][2];
  10. lli dp[N+10][2];
  11.  
  12. int main(){
  13.  
  14.     scanf("%d%d%d", &n, &k, &m);
  15.  
  16.     mn[0][0] = INF;
  17.     for(int i=1;i<=n;i++) {
  18.         scanf("%lld", &qs[i]);
  19.         qs[i] += qs[i-1];
  20.         mn[i][0] = min(mn[i-1][0], -qs[i-1]);
  21.     }
  22.  
  23.     // for(int j=1;j<=k;j++) dp[0][j] = INF; ใส่ใน loop
  24.    
  25.     // opt mem (3)
  26.     /*
  27.     เนื่องจากพิจารณาเฉพาะ j-1 กับ j เท่านั้น
  28.     loop for j=1 -> k
  29.             for i=1 -> n
  30.                 เพื่อให้ opt mem ในการเรียกช่อง array ได้  
  31.     */
  32.     dp[0][0] = INF;
  33.     for(int j=1;j<=k;j++){
  34.         dp[0][j%2] = INF;
  35.         mn[0][j%2] = INF;
  36.         for(int i=1;i<=n;i++){
  37.             dp[i][j%2] = dp[i-1][j%2];
  38.             if(i-m+1 >= 1) dp[i][j%2] = min(dp[i][j%2], qs[i] + mn[i-m+1][(j-1)%2]);
  39.             mn[i][j%2] = mn[i-1][j%2];
  40.             if(i>=2) mn[i][j%2] = min(mn[i][j%2], -qs[i-1] + dp[i-2][j%2]);
  41.         }
  42.     }
  43.  
  44.     printf("%lld", qs[n] - dp[n][k%2]);
  45.  
  46.     // opt time (2)
  47.     /*
  48.     for(int i=1;i<=n;i++){
  49.         for(int j=1;j<=k;j++){
  50.             dp[i][j] = dp[i-1][j];
  51.             if(i-m+1 >= 1) dp[i][j] = min(dp[i][j], qs[i] + mn[i-m+1][j-1]);
  52.             if(i-2 < 0) mn[i][j] = min(mn[i][j], -qs[i-1]);
  53.             else mn[i][j] = min(mn[i-1][j], -qs[i-1] + dp[i-2][j]);
  54.         }
  55.     }
  56.     */
  57.  
  58.     // topdown (1)
  59.     /*
  60.     for(int i=1;i<=n;i++){
  61.         for(int j=1;j<=k;j++){
  62.             dp[i][j] = dp[i-1][j];
  63.             for(int idx=1;idx<=i-m+1;idx++){
  64.                 if(j == 1)
  65.                     dp[i][j] = min(dp[i][j], qs[i] - qs[idx-1]);
  66.                 else if(idx >= 2)
  67.                     dp[i][j] = min(dp[i][j], qs[i] - qs[idx-1] + dp[idx-2][j-1]);
  68.             }
  69.             printf("\n");
  70.         }
  71.     }
  72.     */
  73.  
  74.     return 0;
  75. }
  76. /***
  77. 7 1 3
  78. 1 0 4 8 5 7 6
  79. 26
  80. 12 3 2
  81. 2 -8 3 -4 5 -7 3 5 -2 2 4 1
  82. 17
  83. */
  84.  
Add Comment
Please, Sign In to add comment