zoukankan      html  css  js  c++  java
  • 连通数组的最大子数组和

    //思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行。第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后就可求出最大联通子数组的和。

    #include<iostream>
    #include<fstream>
    #define N 100
    using namespace std;
    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;
    }

    void readarry(int arry[][N], int &line, int &row) //读取txt文件中的二维数组
    {
    ifstream infile("a.txt");
    if (!infile)
    cout << "读取失败!" << endl;
    else
    {
    infile >> line >> row;
    for (int i = 0; i<line; i++)
    {
    for (int j = 0; j<row; j++)
    {
    infile >> arry[i][j];
    }
    }
    }
    }
    void show(int arry[][N], int line, int row) //显示数组
    {
    printf("从“a.txt”文件中读取的数组为: ");
    for (int i = 0; i<line; i++)
    {
    for (int j = 0; j<row; j++)
    {
    printf(" %d ", arry[i][j]);
    }
    printf(" ");
    }
    }
    void main()
    {
    int line, row, i, j, sm, mm, t2;
    int sum, max;
    int up[100], down[100], t[100];
    int a[100][100], b[100];
    readarry(a, line, row);
    show(a, line, row);

    for (i = 0; i<line; i++)
    {
    for (j = 0; j<row; j++)
    {
    b[j] = a[i][j];
    }
    sum = zuida(row, b, &sm, &mm);
    up[i] = sm;
    down[i] = mm;
    t[i] = sum;

    }
    t2 = t[0];
    for (i = 0; i + 1<line; 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;

    }

     

  • 相关阅读:
    opencv mat转IplImage*
    运行程序时命令窗口一闪而过
    python version 2.7 required,which was not found in the registry
    《深入浅出wpf》 控件
    opengl glut vs2013配置
    《深入浅出wpf》第六章 深入浅出话binding
    《深入浅出wpf》第五章 控件与布局
    十大暴利行业
    java安装与配置
    ArcGIS For Flex学习之Mapping---Select and zoom
  • 原文地址:https://www.cnblogs.com/qinxian0/p/5360900.html
Copyright © 2011-2022 走看看