Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. #define inf 100000000
  5.  
  6. using namespace std;
  7.  
  8. vector<int> villages(300);
  9. int pref[300];
  10. int f[31][301];
  11. int pa[31][301];
  12. int m[301][301];
  13.  
  14. int cost(int l, int r){
  15. l--; r--;
  16. int ml = m[l][r];
  17. return villages[ml]*((ml - l + 1) - (r - ml + 1))- (pref[ml+1] - pref[l]) + (pref[r+1] - pref[ml]);
  18. }
  19.  
  20. int main() {
  21. int v, p;
  22. cin >> v >> p;
  23.  
  24. for (int i = 0; i < v; i++) {
  25. cin >> villages[i];
  26. }
  27.  
  28. pref[0] = 0;
  29. for (int i = 1; i <= v; i++) {
  30. pref[i] = pref[i - 1] + villages[i-1];
  31. }
  32.  
  33. int i;
  34. for(int left = 0; left < v; left++){
  35. for(int r = left; r <= v; r++){
  36. int mid = (r - left ) / 2 + left;
  37. m[left][r] = mid;
  38. }
  39. }
  40.  
  41. for(i = 0; i <= v + 1; i++){
  42. pa[i][0] = inf;
  43. }
  44.  
  45. for(i = 1; i <= v; i++){
  46. f[1][i] = cost(1, i);
  47. }
  48.  
  49. for (int k = 2; k <= p; k++) { // порядок перебора состояний следует из неравенств
  50. for (int n = v; n >= k; n--) { // порядок перебора состояний следует из неравенств
  51. f[k][n] = inf;
  52. for (i = 1/*pa[k - 1][n]*/; i <= /*pa[k][n + 1]*/ v; i++) { // уже посчитаны
  53. int tmp = f[k - 1][i] + cost(i+1, n);
  54. if (tmp < f[k][n]) {
  55. f[k][n] = tmp;
  56. pa[k][n] = i;
  57. }
  58. }
  59. }
  60. }
  61.  
  62. cout << f[p][v] << endl;
  63.  
  64. vector<int> posts;
  65. int tmp = v-1;
  66. for(int k = p; k > 0; k--){
  67. posts.push_back(m[pa[k][tmp]+1][tmp]);
  68. // cout << "k = " << k << " m = " << m[pa[k][tmp]+1][tmp] << " p = " << pa[k][tmp] << " tmp = " << tmp << endl;
  69. tmp = pa[k][tmp];
  70. }
  71.  
  72. for(int k = posts.size()-1; k >= 0; k--){
  73. cout << villages[posts[k]] << " " ;
  74. } cout << endl;
  75.  
  76. return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement