zoukankan      html  css  js  c++  java
  • 最大子数组和2.0

    //求最大子数组和 张鹏宇 武于微
    /****************************************************************
    题目要求:
    用户输入整数组,首尾相接,寻找最大子数组,求出其和,并返回子数组位置
    思路:
    用户随机输入num个整数(num由用户确定),存入数组number[][]
    用循环实现二维数组转化,目的是实现数组收尾相接,找出最大子数组
    用两个循环实现寻找每一个整数作为初始值得最大子数组,并将结果存入CMax[]
    最后输出CMax中的最大值,
    每次扫描寻找子数组时,定义一个flag[]数组
    对应用来存储该位置的整数是否在子数组中
    最后扫描flag[],输出对应位置整数即可
    不足:
    输出子数组位置时:情况一:****ABC****(ABC是目标整数,*是无用数据)
             情况二:------+++++(-表示负数+表示正数)
    这两种情况无法输出子数组,调试不知道哪里错了,子数组的和一切正常
    *****************************************************************/
    #include<iostream>
    #include<cmath>
    using namespace std;
    
    int main()
    {
        int num,Max,number[200][200],dp[200][2],CMax[200],flag[200][200]={0};
        cout<<"请输入整数个数:"<<endl;
        cin>>num;
        cout<<"请输入整数组:"<<endl;
        for(int i=0;i<num;i++)
            cin>>number[0][i];
        for(int i=1;i<num;i++)/**********二维数组转化**********/
        {
            for(int j=0;j<num-1;j++)
                number[i][j]=number[i-1][j+1];
            number[i][num-1]=number[i-1][0];
        }
    
        for(int i=0;i<num;i++)/***********第N行**********/
        {
            for(int j=1;j<num+1;j++)/***********前N个**********/
            {
                dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
                dp[j][1]=max(dp[j-1][1]+number[i][j],number[i][j]);
                if(number[i][j]==dp[j][1])
                {
                    for(int k=0;k<j;k++)
                        flag[i][k]=0;
                    flag[i][j]=1;
                }
                else if(dp[j-1][1]+number[i][j]==dp[j][1])
                    flag[i][j]=1;        
                CMax[i]=max(dp[j][0],dp[j][1]);    
            }
        }    
        Max=CMax[0];
        int k;
        for(int i=0;i<num-1;i++)
        {
            if(Max<CMax[i])
            {
                Max=CMax[i];
                k=i;
            }
        }
        cout<<"子数组为:"<<endl;
        for(int j=0;j<num;j++)
        {
            if(flag[k][j]==1)
                cout<<number[k][j]<<"    ";
        }
        cout<<endl;
        cout<<"和为:"<<Max<<endl;
        return 0;
    }

    运行结果截图:

    体会:

      这次的题目是上次题目的升级版本,要求数组可成为一个环,即首尾相接返回最大子数组的和,并返回子数组,比上次题目有些难度,关键是数组的首尾相接并判断跳出来返回,经过多次思路的转换达到效果,不过还有仍待改进的不足之处,继续努力。

    结对的小伙伴博客:http://www.cnblogs.com/fooreveryu/

  • 相关阅读:
    AS报错
    第二章课下测试补交博客
    第七章课下测试总结
    2017-2018-1 20155235 20155211 实验四 外设驱动程序设计
    2017-2018-1 20155235 《信息安全系统设计基础》第十一周学习总结
    pwd命令的实现
    2017-2018-1 20155235 实验三 实时系统 实验内容
    2017-2018-1 20155235 《信息安全系统设计基础》第九周学习总结
    20155219 20155224 20155235 信息安全技术概论 第三次实验报告
    2017-2018-1 20155235 《信息安全系统设计基础》第八周学习总结
  • 原文地址:https://www.cnblogs.com/wuyw/p/5325252.html
Copyright © 2011-2022 走看看