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/

  • 相关阅读:
    C博客作业02--循环结构
    博客作业01--顺序分支结构
    C博客作业00--我的第一篇博客
    实验四
    实验三
    网络管理snmp实验
    C语言博客作业02--循环结构
    C博客作业03--函数
    循环结构
    C语言博客作业02--循环结构
  • 原文地址:https://www.cnblogs.com/wuyw/p/5325252.html
Copyright © 2011-2022 走看看