zoukankan      html  css  js  c++  java
  • 返回二维数组最大联通子数组的和

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

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

    代码:

    #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;
        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;
    }

    测试结果:

     

    总结:这次开发利用上次程序的思想-降维,也复习了以前的文件读入读出流

    开发日志:

    星期 听课 上网查资料 编程 读书 总计
    周二   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://www.cnblogs.com/lvstudy/

  • 相关阅读:
    Tencent 闲聊对话机器人接口调用,画像:设计员小白
    logging模块简介python
    jieba分词的几种形式
    h5py这个坑-PyCharm Process finished with exit code -1073741819 (0xC0000005)
    python之six模块的用法six.py2 six.py3
    Swoole从入门到入土(8)——协程初探
    Swoole从入门到入土(7)——TCP服务器[大杂烩]
    Swoole从入门到入土(6)——TCP服务器[粘包]
    Swoole从入门到入土(5)——TCP服务器[异步任务]
    Swoole从入门到入土(4)——TCP服务器[正确重启]
  • 原文地址:https://www.cnblogs.com/apan008/p/5360905.html
Copyright © 2011-2022 走看看