算法期中 最小和

来源:互联网 发布:淘宝网买东西流程 编辑:程序博客网 时间:2024/06/06 00:17

Problem

从数列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是给出的数列,返回值为所求的最小和.

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

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

思路

  1. 当数组只有一个元素时,直接返回第一个元素;
  2. 当数组有两个元素,返回最下的一个;
  3. 数组有三个或以上元素时,设置数组S,若序号为i,则S[i]表示以数组第i个元素结尾的最小和。
对于数列 1 2 3 4 5 6 设S[0] = a[0];S[1] = a[1]; S[2]为以3结尾的最小和,很明显,序列要么是 1 3 要么是 2 3同理,S[3]是以4结尾的最小和,序列选择有:1 2 41 3 42 3 42 4显然,2 4 是最小和序列由于题目规则,在第 ii+1个元素中,必须选择一个,所以,在算第i个元素结尾的最小和时,i-1i-2中的一个元素必须被选择,所以第i个元素的最小和等于以i-1i-2结尾的元素的最小和加上本身。存在以下规律S[i] = min(S[i-2] + a[2] + S[i-1] + a[2])  i >= 3

Code

class Solution {public:    int minSum(vector<int>& A) {        if (A.size() == 1)            return A[0];        int *S = new int[A.size()];        S[0] = A[0];        S[1] = A[1];        for (int i = 2; i < A.size(); i++) {            S[i] = min(S[i-1] + A[i], S[i-2] + A[i]);        }        return min(S[A.size()-1, A.size()-2]);    }};
原创粉丝点击