Advertisement
Guest User

Untitled

a guest
Aug 28th, 2015
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.97 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define REP(i,n) for(int i=0;i<(int)(n);i++)
  4. #define ALL(x) (x).begin(),(x).end()
  5.  
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9.  
  10. const ll INF = 1e14;
  11.  
  12. int S, N, M;
  13. ll P[2048], sum[2048];
  14. pair<ll,int> memo[2048][2048];
  15.  
  16. ll range(int i, int j) { return P[j] * (j - i) - sum[j] + sum[i]; }
  17.  
  18. pair<ll,int> dp(int n, int m) {
  19. if (m == -1) return make_pair(INF, 0);
  20. if (n <= m) return make_pair(0, n-1);
  21. if (memo[n][m].first != -1) return memo[n][m];
  22. pair<ll,int> res = make_pair(INF, 0);
  23. int from = dp(n-1, m).second, to = dp(n, m+1).second;
  24. for (int i = from; i <= min(n-1, to); ++i)
  25. res = min(res, make_pair(dp(i, m-1).first + range(i, n-1), i));
  26. return memo[n][m] = res;
  27. }
  28.  
  29. int main() {
  30. cin >> S >> N >> M;
  31. vector<int> x(S);
  32. REP(i,S) cin >> x[i];
  33. REP(i,N) {
  34. int t, p; cin >> t >> p;
  35. P[i] = t - x[p-1];
  36. }
  37. sort(P, P+N);
  38. REP(i,N) sum[i+1] = sum[i] + P[i];
  39. memset(memo, -1, sizeof(memo));
  40. cout << dp(N, M).first << endl;
  41. return 0;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement