• 返回一个环状整数数组中最大子数组之和


    题目:返回一个整数数组中最大子数组的和。
    要求:

    • 输入一个整形数组,数组里有正数也有负数。
    • 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    • 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
    • 同时返回最大子数组的位置。
    • 求所有子数组的和的最大值。

    结对编程要求:

    • 两人结对完成编程任务。
    • 一人主要负责程序分析,代码编程。
    • 一人负责代码复审和代码测试计划。
    • 发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。(截止时间3月26日晚24:00之前)

    分析:相比于上一次的任务,这次的不同在于,数组是环状的,求出所有可能子数组之和的最大值,并确定该子数组所在的位置。这时就会有两种想法:a想到环状,就想到了数据结构中的循环链表,balabala。。。。。b其实也不难,只是加入环状之后,每次搜索子数组的起点在变,终点也会变化。这时仅仅需要把每一种起点情况下的最大子数组之和S求出,存入S[]数组中,最后比较S[]中的最大值(i为数组的长度)存为MaxSum。而此时的起点-finalStart和终点-finalEnd也同样可以在求MaxSum的同时记录下来。最后输出结果。

    代码实现如下:

    //求数组中最大子序列的和  王世强 2016/3/24 
    #include<iostream>
    using namespace std;
    int main()
    {
    	int Array[100],i=1,dp[100][2],j,MaxSum;
    	int s0=-1,e0=-1,s1=0,e1=0;
    	cout<<"请输入一组数组:";
    	cin>>Array[0];
    	while(getchar()!='
    ')   //输入数组部分,空格表示输入结束 
    	{
    		cin>>Array[i++];
    	}
    	int S[i],start[i],end[i],n,finalStart,finalEnd;
    	for(n=0;n<i;n++) 
    	{
    		dp[0][0]=Array[n];
    		dp[0][1]=Array[n];
    		for(j=1;j<i;j++)
    		{
    			if(dp[j-1][0]<dp[j-1][1])
    			{
    				dp[j][0]=dp[j-1][1];
    				s0=s1,e0=e1;
    			}
    			else
    			{
    				dp[j][0]=dp[j-1][0];
    			}
    			if(Array[j]<(dp[j-1][1]+Array[(j+n)%i]))
    			{
    				dp[j][1]=dp[j-1][1]+Array[(j+n)%i];
    				e1=j+n;
    			}
    			else
    			{
    				dp[j][1]=Array[(j+n)%i];
    				s1=e1=j+n;
    			}
    		}
    		if(dp[j-1][0]>dp[j-1][1])
    		{
    			S[n]=dp[j-1][0];
    	      	start[n]=s0;
    	 		end[n]=e0;
    		}
    		else
    		{
    	        S[n]=dp[j-1][1];
    			start[n]=s1;
    	 		end[n]=e1;
    		}	
    	}
    	MaxSum=S[0];
    	finalStart=start[0];
    	finalEnd=end[0];
    	for(n=0;n<i;n++)
    	{
    		if(MaxSum<S[n])
    		{
    			MaxSum=S[n];
    			finalStart=start[n];
    			finalEnd=end[n];
    		}
    	}
    	cout<<"最大子数组为和:"<<MaxSum<<"
    最大子数组为:";
    	for(int q=finalStart;q<=finalEnd;q++)
    	{
    		cout<<Array[q%i]<<" ";
    	}
    	return 0;
     } 
    

      运行结果截图:

    总结:团队开发还是效率挺高的,可以相互交流比较好的想法,相互学习。如果一个人单独思考,想法具有局限性,而且还可能特别花时间。

    虚心学习,共同进步!

  • 相关阅读:
    复合梯形公式、复合辛普森公式 matlab
    拉格朗日插值和牛顿插值 matlab
    数值分析 最小二乘 matlab
    最短路径Dijkstra matlab
    最小生成数 克鲁斯卡尔 普里姆 matlab
    [ 9.9 ]CF每日一题系列—— 259A黑白棋盘检查问题
    Tarjan求缩点化强连通图
    CF每日一题系列 —— 415A
    [kuangbin]树链剖分 C
    [kuangbin]树链剖分 D
  • 原文地址:https://www.cnblogs.com/wsqJohn/p/5316498.html
Copyright © 2020-2023  润新知