@LIUHUAN
2020-02-04T16:05:30.000000Z
字数 2612
阅读 889
algorithm
int sum = INT_MIN;int maxSumAfterPartitioning(vector<int>& A, int K){return maxsum(A,0,K);// maxsum(A, 0, K);// return sum;}int maxsum(vector<int>& A, int i, int K){int n = A.size();if (i >= n)return 0;int s = 0;for (int k = 0; k < K; k++) {int j = i + k;if (j >= n)break;int maxe = maxElem(A, i, j);int size = k + 1;int sumk = maxe * size;s = max(s, sumk + maxsum(A, j + 1, K));// sum = max(sum, s); global max result}return s;}int maxElem(vector<int>& A, int i, int j){int c = A[i];for (int k = i + 1; k <= j; ++k) {c = max(c, A[k]);}return c;}
map,也可以用数组,来缓存已经计算完的数据。对于已经获取的数据直接返回结果。map来保存,例如map[2]=x,表示的子数组分割的最大值。
int sum = INT_MIN;unordered_map<int, int> umap;int maxSumAfterPartitioning(vector<int>& A, int K){maxsum(A, 0, K);return sum;}int maxsum(vector<int>& A, int i, int K){int n = A.size();if (i >= n)return 0;if (umap.find(i) != umap.end())return umap[i];int s = 0;for (int k = 0; k < K; k++) {int j = i + k;if (j >= n)break;int maxe = maxElem(A, i, j);int size = k + 1;int sumk = maxe * size;s = max(s, sumk + maxsum(A, j + 1, K));sum = max(sum, s);}umap[i] = s;return s;}int maxElem(vector<int>& A, int i, int j){int c = A[i];for (int k = i + 1; k <= j; ++k) {c = max(c, A[k]);}return c;}
int maxSumAfterPartitioning(vector<int>& A, int K){int n = A.size();vector<int> dp(n, 0);for (int i = 0; i < n; ++i) {int maxe = 0;for (int k = 0; k < K; ++k) {int j = i - k;if (j < 0)break;int dpj = 0;if (j >= 1)dpj = dp[j - 1];maxe = max(maxe, A[j]);int dpjsum = maxe * (k + 1);dp[i] = max(dpj + dpjsum, dp[i]);}}return dp[n - 1];}