算法期中1005. 最小和

Description
从数列A[0], A[1], A[2], …, A[N-1]中选若干个数,要求对于每个,i(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) {

}

};

例1:A = {2, 5, 2},答案为4.

例2:A = {2, 5, 4},答案为5.

注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码. 注意不要修改类和函数的名称.

解析:
A = {2, 5, 4 ,8}
初始化:
notChooseCurrent = 0;
chooseCurrent = 2;
i = 1
notChooseCurrent = 2(上一次的chooseCurrent )
ChooseCurrent = min(0, 2) + 5 = 5
i = 2
notChooseCurrent = 5(上一次的chooseCurrent )
ChooseCurrent = min(2, 5) + 4 = 6
i = 3
notChooseCurrent = 6(上一次的chooseCurrent )
ChooseCurrent = min(5, 6) + 8 = 13
最终结果是min(5, 6) = 6

代码:

class Solution {
public:
    int minSum(vector<int>& A) {
        if (A.size() == 0) return 0;
        int notChooseCurrent = 0;   // 表示没有选择当前
        int chooseCurrent = A[0];   // 表示选择了当前数字  
        for (int i = 1; i < A.size(); i++) {
            int temp = notChooseCurrent;
            notChooseCurrent = chooseCurrent; // 没有选择当前数字,那么它等于上次选择了的值  
            chooseCurrent = min(temp, chooseCurrent) + A[i]; // 选择了当前数字,值只能等于(上次没选择 / 上次选择了)最小值+当前的数字  
        }
        return min(chooseCurrent, notChooseCurrent );
    }
};                            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值