Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int n, m;
  7. vector <int> input;
  8.  
  9. int value(vector <int> &values, vector <int> &temp, int left, int right){
  10.    
  11.     int center = (left + right) / 2;
  12.    
  13.     int r_to_m;
  14.     int m_to_l;
  15.    
  16.     if(!((right - left + 1) % 2)){
  17.         r_to_m = temp[right + 1] - temp[center + 1];
  18.         m_to_l = temp[center] - temp[left];
  19.         return r_to_m - m_to_l - values[center];
  20.     } else {
  21.         int r_to_m = temp[right + 1] - temp[center + 1];
  22.         int m_to_l = temp[center] - temp[left];
  23.         return r_to_m - m_to_l;
  24.     }
  25. }
  26.  
  27.  
  28. int main() {
  29.     int temp_n;
  30.     int temp_rasst;
  31.     int some = 0;
  32.     int new_one;
  33.    
  34.     cin >> n >> m;
  35.    
  36.     vector <int> total(m);
  37.     vector <vector <int>> search(m + 1, vector <int>(n + 1, 0));
  38.     vector <int> sumka(n + 1);
  39.    
  40.     for(int i = 0; i < sumka.size(); i++){
  41.         sumka[i] = 0;
  42.     }
  43.    
  44.     for(int i = 0; i < n; i++){
  45.         int x;
  46.         cin >> x;
  47.         input.push_back(x);
  48.     }
  49.    
  50.     for(int i = 1; i < n + 1; i++){
  51.         sumka[i] = sumka[i - 1] + input[i - 1];
  52.     }
  53.  
  54.  
  55.     int maximum = sumka[n] - sumka[0];
  56.    
  57.     for(int i = 1; i < n + 1; i++){
  58.         search[0][i] = maximum;
  59.     }
  60.    
  61.     int temp_min;
  62.    
  63.     for(int i = 1; i < m + 1; i++){
  64.         for (int j = 1; j < n + 1; j++){
  65.             temp_min = maximum;
  66.             for (int z = 0; z < j; z++){
  67.                 temp_min = min(temp_min, search[i - 1][z] + value(input, sumka, z, j - 1));
  68.             }
  69.             search[i][j] = temp_min;
  70.         }
  71.     }
  72.    
  73.     int result = search[m][n];
  74.     cout << result << endl;
  75.    
  76.     temp_n = n;
  77.    
  78.     for(int i = m; i > 0; i--){
  79.         for(int j = 0; j <= temp_n; j++){
  80.             if(search[i][temp_n] == search[i - 1][j] + value(input, sumka, j, temp_n - 1)){
  81.                 temp_min = new_one;
  82.                 temp_rasst = j;
  83.             }
  84.         }
  85.        
  86.         total[some++] = input[(temp_rasst + temp_n - 1) / 2];
  87.         temp_n = temp_rasst;
  88.  
  89.     }
  90.    
  91.     for(int i = m - 1; i >= 0; i--)
  92.         cout << total[i] << " ";
  93.    
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement