Advertisement
deushiro

Untitled

Dec 2nd, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <map>
  7. #include <set>
  8. #include <bitset>
  9.        
  10. using namespace std;
  11. typedef long long ll;
  12.  
  13. int main() {
  14.     ios_base::sync_with_stdio(false);
  15.     cin.tie(0);
  16.     cout.tie(0);
  17.     ll n, k;
  18.     cin >> n >> k;
  19.     vector<vector<pair<ll, int>>> dp(n, vector<pair<ll, int>>(k, {0, 0}));
  20.     vector<ll> a(n);
  21.     for(int i = 0; i < n; ++i){
  22.         cin >> a[i];
  23.     }
  24.     dp[0][0].first = a[0];
  25.     for(int i = 1; i < n; ++i){
  26.         dp[i][0].first = min(dp[i - 1][0].first, a[i]);
  27.         dp[i][0].second = -1;
  28.     }
  29.     for(int i = 1; i < k; ++i){
  30.         for(int j = 1; j < k; ++j){
  31.             ll c = a[i];
  32.             for(int v = 0; v < i; ++v){
  33.                 c = min(c, a[i - v]);
  34.                 if(dp[i - v - 1][j - 1].first + c >= dp[i][j].first){
  35.                     dp[i][j].first = max(dp[i - v - 1][j - 1].first + c, dp[i][j].first);
  36.                     dp[i][j].second = i - v - 1;
  37.                 }
  38.             }
  39.         }
  40.     }
  41.     for(int i = k; i < n; ++i){
  42.         for(int j = 1; j < k; ++j){
  43.             ll c = a[i];
  44.             for(int v = 0; v < i; ++v){
  45.                 c = min(c, a[i - v]);
  46.                 if(dp[i - v - 1][j - 1].first + c >= dp[i][j].first){
  47.                     dp[i][j].first = max(dp[i - v - 1][j - 1].first + c, dp[i][j].first);
  48.                     dp[i][j].second = i - v - 1;
  49.                 }
  50.             }
  51.         }
  52.     }
  53.     cout << dp[n - 1][k - 1].first << "\n";
  54.     int i = n - 1;
  55.     int j = k - 1;
  56.     vector<int> res;
  57.     for(int x = 0; x < k - 1; ++x){
  58.         res.push_back(dp[i][j - x].second + 1);
  59.         i = dp[i][j - x].second;
  60.     }
  61.     for(int i = res.size() - 1; i > -1; --i){
  62.         cout << res[i] << " ";
  63.     }
  64.     cout << endl;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement