动态规划

求最大子数组,最大子乘积

#include <iostream>
#include <vector>
using namespace std;
int max(int a, int b, int c)
{
    return (a > b) ? (a > c ? a : c) : (b > c ? b : c);
}
int min(int a, int b, int c)
{
    return (a < b) ? (a < c ? a : c) : (b< c ? b: c);
}
int pro(vector<int> a)
{
    
    if (a.size() == 0)
        return 0;
    if (a.size() == 1)
        return a[0];
    int p,q;
    p= q = a[0];
    int res = a[0];
    int st1, ed1;
    int st2, ed2;
    st1= ed1 =st2=ed2= 0;
    int res1 = a[0];
    for (int i = 1;i < a.size();i++)
    {
        //p和q代表最大值和最小值
        int temp1 = p;
        int temp2 = q;
        p = max(p*a[i], a[i], temp2*a[i]);//p和q代表当下以n为结尾的最大子数组的值
        q = min(temp1*a[i], q*a[i], a[i]);
        res = (res > p ? res : p);
        res1 = (res1 < q ? res : q);
        if (res == p)
        {
            if (p == a[i])
                st1 = i;
            if (p == temp2*a[i])
                st1 = st2;
            ed1 = i;
        }
        if (res1 == q)
        {
            if (q == a[i])
                st2 = i;
            if (q == temp1*a[i])
                st2 = st1;
            ed2 = i;
        }
        //res1 = (res1 < q ? res : q);
        
    }
    cout << st1 << ed1;
    cout << endl << res1;
    return res;
}

void main()
{
    vector<int> M = { -1,2,3,4,9,-2,5,-3 };
    cout << pro(M);
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,353评论 0 18
  • 分治方法 将问题划分成互不相交的子问题 递归地求解子问题 将子问题的解组合起来 动态规划(两个要素:最优子结构、子...
    superlj666阅读 537评论 0 0
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,782评论 0 89
  • 定义一组子问题,按照由小到大,以小问题的解答支持大问题求解的模式,依次解决所有的子问题,并最终得到原问题的解答。 ...
    芥丶未央阅读 921评论 0 2
  • 当我们到了一定的年纪,爱情就是权衡利弊的选择一个跟自己要求匹配的人,爱情没有冲动,没有心动。所以前辈们告诉我们生活...
    本尊主阅读 249评论 0 0