[关闭]
@LIUHUAN 2020-02-05T00:05:30.000000Z 字数 2612 阅读 707

拆分数组使和最大从递归到迭代

algorithm


拆分数组


方法一:递归

  1. int sum = INT_MIN;
  2. int maxSumAfterPartitioning(vector<int>& A, int K)
  3. {
  4. return maxsum(A,0,K);
  5. // maxsum(A, 0, K);
  6. // return sum;
  7. }
  8. int maxsum(vector<int>& A, int i, int K)
  9. {
  10. int n = A.size();
  11. if (i >= n)
  12. return 0;
  13. int s = 0;
  14. for (int k = 0; k < K; k++) {
  15. int j = i + k;
  16. if (j >= n)
  17. break;
  18. int maxe = maxElem(A, i, j);
  19. int size = k + 1;
  20. int sumk = maxe * size;
  21. s = max(s, sumk + maxsum(A, j + 1, K));
  22. // sum = max(sum, s); global max result
  23. }
  24. return s;
  25. }
  26. int maxElem(vector<int>& A, int i, int j)
  27. {
  28. int c = A[i];
  29. for (int k = i + 1; k <= j; ++k) {
  30. c = max(c, A[k]);
  31. }
  32. return c;
  33. }

方法二:转化为备忘录递归

  1. int sum = INT_MIN;
  2. unordered_map<int, int> umap;
  3. int maxSumAfterPartitioning(vector<int>& A, int K)
  4. {
  5. maxsum(A, 0, K);
  6. return sum;
  7. }
  8. int maxsum(vector<int>& A, int i, int K)
  9. {
  10. int n = A.size();
  11. if (i >= n)
  12. return 0;
  13. if (umap.find(i) != umap.end())
  14. return umap[i];
  15. int s = 0;
  16. for (int k = 0; k < K; k++) {
  17. int j = i + k;
  18. if (j >= n)
  19. break;
  20. int maxe = maxElem(A, i, j);
  21. int size = k + 1;
  22. int sumk = maxe * size;
  23. s = max(s, sumk + maxsum(A, j + 1, K));
  24. sum = max(sum, s);
  25. }
  26. umap[i] = s;
  27. return s;
  28. }
  29. int maxElem(vector<int>& A, int i, int j)
  30. {
  31. int c = A[i];
  32. for (int k = i + 1; k <= j; ++k) {
  33. c = max(c, A[k]);
  34. }
  35. return c;
  36. }

方法三:拆分数组(转化为迭代计算)


- 基本情况:

  1. int maxSumAfterPartitioning(vector<int>& A, int K)
  2. {
  3. int n = A.size();
  4. vector<int> dp(n, 0);
  5. for (int i = 0; i < n; ++i) {
  6. int maxe = 0;
  7. for (int k = 0; k < K; ++k) {
  8. int j = i - k;
  9. if (j < 0)
  10. break;
  11. int dpj = 0;
  12. if (j >= 1)
  13. dpj = dp[j - 1];
  14. maxe = max(maxe, A[j]);
  15. int dpjsum = maxe * (k + 1);
  16. dp[i] = max(dpj + dpjsum, dp[i]);
  17. }
  18. }
  19. return dp[n - 1];
  20. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注