zoukankan      html  css  js  c++  java
  • 最大联通子数组

    1.题目:返回一个二维整数数组中最大联通子数组的和。
    要求:
    输入一个二维整形数组,数组里有正数也有负数。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。
    2.设计思路
    对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行。第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后就可求出最大联通子数组的和。
    3.源代码
    #include<iostream>
    using namespace std;
    int zuida(int n, int a[], int *sm, int *mm);
    
    void main()
    {
        int m, n, i, j, sm, mm, t2;
        int sum, max;
        int up[100], down[100], t[100];
        int a[100][100], b[100];
        cout << "输入二维数组的行" << endl;
        cin >> m;
        cout << "输入二维数组的列" << endl;
        cin >> n;
        for (i = 0; i<m; i++)
        {
            for (j = 0; j<n; j++)
            {
                cin >> a[i][j];
            }
        }
    
        for (i = 0; i<m; i++)
        {
            for (j = 0; j<n; j++)
            {
                b[j] = a[i][j];
            }
            sum = zuida(n, b, &sm, &mm);
            up[i] = sum;
            down[i] = mm;
            t[i] = sum;
    
        }
        t2 = t[0];
        for (i = 0; i + 1<m; i++)
        {
            if (up[i] <= down[i + 1] && down[i] >= up[i + 1])
            {
                t2 += t[i + 1];
            }
            for (j = up[i]; j<up[i + 1]; j++)
            {
                if (a[i + 1][j]>0) t2 += a[i + 1][j];                   //判别独立正数
            }
    
        }
        cout << t2 << endl;
    
    }
    
    
    int zuida(int n, int a[], int *sm, int *mm)
    {
        int b[100] = { 0 };
        int i, sum1 = 0, max1 = 0;
        for (i = 0; i<n; i++)
        {
            if (sum1<0)
            {
                sum1 = a[i];
            }
            else
            {
                sum1 = sum1 + a[i];
            }
            b[i] = sum1;
        }
        max1 = b[0];
        for (i = 0; i<n; i++)
        {
            if (max1<b[i])
            {
                max1 = b[i];
                *mm = i;
            }
        }
        for (i = *mm; i >= 0; i--)
        {
            if (b[i] == a[i])
            {
                *sm = i;
                break;
            }
        }
        return max1;
    }

    4程序截图

    5.总结

    这个程序当时并没有写出来,后来也就不了了之了。这种做法是很不正确的,以后遇到问题和困难要学会解决,而不是放弃。

  • 相关阅读:
    编程日志 Vue-element-admin
    JS判断全屏,Jquery绑定动态元素Parent元素单击事件
    查询所有表内容-SQL
    正则分割获取字符串中的数字部分(包括连续数字)(连续数字的分割获取)
    nginx本地正常访问,外网无法访问
    nuget 配置无效
    URL获取上级目录
    VS 调试项目运行不发布,允许其他网内直接访问
    小数(decimal,double) 截取两位或多位,不四舍五入
    Linq简单语句记录
  • 原文地址:https://www.cnblogs.com/gting/p/4581817.html
Copyright © 2011-2022 走看看