返回二维数组最大联通子数组的和

那年仲夏 提交于 2020-03-22 04:43:47

题目:返回二维数组最大联通子数组的和

设计思路:首先,利用文件读入读出流,读取二维数组,再利用降维的思想,求每一行的最大子数组块,遍历所有行,再将各行的最大子数组块进行判断合并。

代码:

#include<iostream>
#include<fstream>
using namespace std;
# define N 100
int zuida(long long int n, long long int a[], long long int *p, long long int *q)//一维数组的最大子数组和
{
    long long int b[N] = { 0 };
    long long 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];
            *q = i;  //记录最大子数组的终点位置
        }
    }
    for (i = *q; i >= 0; i--)
    {
        if (b[i] == a[i])
        {
            *p = i;//记录最大子数组的起点
            break;
        }
    }
    return max1;
}
int main()
{
    long long int m1, m2, i, j, p, q, t2;
    long long int sum, max;
    long long int left[N], right[N], t[N];
    long long int a[N][N], b[N];
    ifstream fin("sz.txt");
    ifstream fin1("sz1.txt");
    fin1 >> m1 >> m2;
    if (m1 <= 0&&m2<=0)
    {
        cout << "输入的行列不正确" << endl;
        return 0;
    }
    cout << "二维数组的行和列为"<< endl;
    cout << m1 << "  " << m2 << endl;
    for (int i = 0; i < m1; i++)
    for (int j = 0; j < m2; j++)
    {
        fin >> a[i][j];
    }
    cout << "TXT文件中的二维数组为" << endl;
    for (int i = 0; i < m1; i++)
    {
        for (int j = 0; j < m2; j++)
        {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    for (i = 0; i<m1; i++)//求每一行最大子数组
    {
        for (j = 0; j<m2; j++)
        {
            b[j] = a[i][j];
        }
        sum = zuida(m1, b, &p, &q);
        left[i] = p;     //记录最大子数组的坐标位置
        right[i] = q;
        t[i] = sum;

    }
    t2 = t[0];
    for (i = 0; i + 1<m2; i++)//将最大子数组合并
    {
        if (left[i] <= right[i + 1] && right[i] >= left[i + 1])//两行的最大子数组块相连
        {
            t2 += t[i + 1];
        }
        for (j = left[i]; j<left[i + 1]; j++)
        {
            if (a[i + 1][j]>0)
                t2 += a[i + 1][j];                   //判别独立正数
        }

    }
    cout <<"最大子数组和为:"<< t2 << endl;
    return 0;
}

测试结果:
===== ===== ===== ===== =====
Compiling...
Compiling done.
===== ===== ===== ===== =====
Doing Unit Test Case 01
lrwxr-xr-x 1 Liam staff 12B 5 19 08:31 input.txt -> cases/01.txt
二维数组的行和列为
0 0
TXT文件中的二维数组为

0 0
最大子数组和为:无,提醒输入错误。



Done: 01.
===== ===== ===== ===== =====
Doing Unit Test Case 02
lrwxr-xr-x 1 Liam staff 12B 5 19 08:31 input.txt -> cases/02.txt
二维数组的行和列为
3 3
TXT文件中的二维数组为

1 5 10

-5 10 -20

-10 10 5
最大子数组和为:31 

 

ALL DONE.
===== ===== ===== ===== =====

总结:这次开发利用上次程序的思想-降维,也复习了以前的文件读入读出流,由于前几个程序助教指出我的程序没有单元测试,所以自己后来又从新检查了下程序,对程序进行边

界的测试,补上了如果输入的行列数为非正整数时,程序应该做出的反应,要提醒用户输入不正确。

开发日志:

星期 听课 上网查资料 编程 读书 总计
周二   1 1   2
周三         0
周四 2       2
周五       1 3
周一   1 1 1 3
周二   2 1   3
周三   1 2 1 4
总计 2 5 5 3 15

 

时间记录日志:

日期 开始时间 结束时间 休息时间 工作时间 活动内容
4/1 19:30 20:30 0 60 结对开发
4/4 16:30 17:30 0 60 结对开发
4/5 19:00 20:00 0 60 结对开发
4/6 13:50 15:30 20 100 结对开发

 

缺陷记录日志:

对文件的读入读出掌握的不太好,不够灵活,自己对二维数组的情况变化考虑的也不是很全面,近期将完善。

队友博客:http://home.cnblogs.com/u/apan008/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!