Advertisement
kolbka_

10A

Dec 3rd, 2021
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10. #include <iostream>
  11. #include <string>
  12. #include <vector>
  13. #include <algorithm>
  14.  
  15. using namespace std;
  16. vector<int> towns;
  17. vector<vector<int>> dp;
  18. vector<vector<int>> pochta;
  19. vector<int> pref;
  20. int bar(int start, int finish) {
  21.     int med = (start + finish-1)/2;
  22.     pochta[start][finish] = med;
  23.     return towns[med]*(2*med-start-finish+1) - (pref[med+1]-pref[start]) + (pref[finish]-pref[med]);
  24. }
  25.  
  26.  
  27. int main() {
  28.     int n, m;
  29.     cin >> n >> m;
  30.     towns.resize(n);
  31.     for (auto &x: towns) {
  32.         cin >> x;
  33.     }
  34.     pref.resize(n+1);
  35.     for(int i = 1; i <= n; i++){
  36.         pref[i] = pref[i-1] + towns[i-1];
  37.     }
  38.     pochta.resize(n+1, vector<int>(n+1));
  39.     dp.resize(n+1, vector<int>(m + 1, 100'000'000));
  40.     vector<vector<pair<int, int>>> last(n+1, vector<pair<int,int>>(m+1));
  41.     for (int i = 0; i <= n; i++) {
  42.         dp[i][1] = bar(0, i);
  43.     }
  44.     for (int k = 2; k <= m; k++) {
  45.         for (int n1 = 0; n1 <= n; n1++) {
  46.             for (int p = k-1; p < n1; p++) {
  47. //                dp[n1][k] = min(dp[p][k - 1] + bar(p, n1), dp[n1][k]);
  48.                 if (dp[p][k - 1] + bar(p, n1) < dp[n1][k]){
  49.                     dp[n1][k] = dp[p][k - 1] + bar(p, n1);
  50.                     last[n1][k] = {p, k-1};
  51.                 }
  52.             }
  53.         }
  54.     }
  55.     cout << dp[n][m] << "\n";
  56.     vector<int>answer;
  57.     pair<int,int> next = last[n][m];
  58.     int p = n;
  59.     while(next.second != 0){
  60.         int finish = p;
  61.         p = next.first;
  62.         answer.push_back(towns[pochta[p][finish]]);
  63.         next = last[next.first][next.second];
  64.     }
  65.     answer.push_back(towns[pochta[0][p]]);
  66.     reverse(answer.begin(), answer.end());
  67.     for (auto x : answer){
  68.         cout << x << " ";
  69.     }
  70. }
  71.  
  72.  
  73.  
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement