最大子数组和2.0

Posted 微微芋头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大子数组和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/

以上是关于最大子数组和2.0的主要内容,如果未能解决你的问题,请参考以下文章

求最大子数组的思想和代码

代码题— 数组最大子序列

真香!8 行代码搞定最大子数组和问题

《剑指Offer——连续子数组的最大和,礼物的最大价值》代码

如何从 Swift 2.0 中获取子数组

代码题(25)— 最大子序和最长上升子序列