最小和 解法
第十周题目
难度:Media
Sicily题号:期中考1005
题目
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& A) {
}
};Example1:
A = {2, 5, 2},答案为4.Example2:
A = {2, 5, 4},答案为5.
思考
本题我们采用动态规划的思想
用F[i]表示前i个元素所能求的的最小和
那么计算F[i]时我们有两种选择,一种是加上原数组的第i个元素,此时F[i]=A[i]+F[i-1];另一种是不加上第i个元素的,此时F[i]=A[i-1]+F[i-2]。
另外当数组只有一个元素时,很明显最小和为0
当数组有两个元素时,最小和为两者中的偏小值
这样我们就初始化了F[0]和F[1]
后面的值只用利用动态规划求出即可
F[i] = min(A[i] + F[i-1], A[i-1] + F[i-2])
代码
class Solution {
public:
int minSum(vector<int>& A) {
int leng = A.size();
int F[leng];
F[0] = 0;
F[1] = min(A[0], A[1]);
for (int i = 2; i < leng; i++) {
F[i] = min(A[i] + F[i-1], A[i-1] + F[i-2]);
}
return F[leng-1];
}
};