最小和
题目
Description
从数列A[0], A[1], A[2], ..., A[N-1]
中选若干个数,要求对于每个i
(0<= i <N-1
),A[i]
和A[i+1]
至少选一个数,求能选出的最小和.
1 <= N <= 100000, 1 <= A[i] <= 1000
请为下面的Solution类实现解决上述问题的函数minSum,函数参数A是给出的数列,返回值为所求的最小和.
class Solution {
public:
int minSum(vector<int>& A) {
}
};
例1:A = {2, 5, 2},答案为4.
例2:A = {2, 5, 4},答案为5.
解析
这道题目使用动态规划解决。
使用两个动态规划方程:
1) f1(i)表示以A[i]为结尾并选择A[i]的最小和
f1(i)=min{f1(i−2),f1(i−1)}+A[i]
2) f2(i)表示以A[i]为结尾但是不选择选择A[i]的最小和
f2(i)=min{f2(i−2),f2(i−1)}+A[i−1]
结果: min{f1(n),f2(n)} 。
解决
class Solution {
public:
int minSum(vector<int>& A) {
int num = A.size();
vector<int> sum1(num + 1); // 表示以A[i]为结尾并选择A[i]的最小和
sum1[0] = A[0];
sum1[1] = A[1];
for (int i = 2; i <= num; i++) {
sum1[i] = min(sum1[i - 2], sum1[i - 1]) + A[i];
}
vector<int> sum2(num + 1); // 表示以A[i]为结尾并不选择A[i]的最小和
sum2[0] = 0;
sum2[1] = A[0];
for (int i = 2; i <= num; i++) {
sum2[i] = min(sum2[i - 2], sum2[i - 1]) + A[i - 1];
}
return min(sum1[num], sum2[num]);
}
};