gt22

Untitled

Dec 20th, 2019
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int n, m;
  7. vector<int> villages;
  8. int median[301][301];
  9. int p[301][31];
  10. // Интересно, оно работает?..
  11. int cost(int l, int r){
  12.     int med = median[l][r];
  13.     int sum = 0;
  14.     while(l <= r){
  15.         sum += abs( villages[l] - villages[med] );
  16.         l++;
  17.     }
  18.     return sum;
  19. }
  20.  
  21. int main() {
  22.     int dp[301][31];
  23.     cin >> n >> m;
  24.  
  25.     villages.resize(n + 2);
  26.     for(int i = 0; i < n; i++)
  27.         cin >> villages[i];
  28.     // Ура, мы справились прочитать!!!! *надеюсь верно*
  29.  
  30.     //Мда... Кто бы сомневался...
  31.  
  32.     // Тут мы как-то всё считаем для динамики
  33.  
  34.     for(int i = 0; i <= n; i++){
  35.         int cur = i;
  36.         for (int j = i; j <= n; j++){
  37.             while (cur - i < j - cur - 1) cur++;
  38.             median[i][j] = cur;
  39.         }
  40.     }
  41.  
  42.     for (int i = 1; i <= n; i++){
  43.         dp[i][1] = cost(0, i-1);
  44.         p[i][1] = 0;
  45.     }
  46.     // Ура!! Я осознала динамику ^^
  47.     // Или нет...
  48.     for (int cur = 1; cur <= n; cur++)
  49.         for(int k = 2; k <= m; k++) {
  50.             dp[cur][k] = 1000000;
  51.             for (int i = 0; i <= cur; i++) {
  52.                 if (dp[cur][k] > dp[i][k - 1] + cost(i, cur-1)) {
  53.                     dp[cur][k] = dp[i][k - 1] + cost(i, cur-1);
  54.                     p[cur][k] = i;
  55.                 }
  56.             }
  57.         }
  58.  
  59.     cout << dp[n][m];
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment