@LIUHUAN
2020-02-05T00:05:30.000000Z
字数 2612
阅读 707
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];
}