zoukankan      html  css  js  c++  java
  • 软工第三次作业——最大子段和的求解

    一、问题描述

    给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

    --引用自《百度百科

    二、问题分析

    1.求最大子段和算法分析

    整型变量Max作为序列s[]的长度,定义数组Sum[]保存s[Max]各个元素的累加值,即最大子段和的候选值序列,underzero记录序列s[]中小于等于0的元素的个数,定义MAXSUM为最大子段和,若underzero=Max,即如果序列s[]中的元素均小于等于0,输出最大子段和为0;否则的话给MAXSUM赋初值Sum[0];然后和Sum[]中的其他元素比较;若MAXSUM<=Sum[i];则将Sum[i]赋值给MAXSUM,这样就得到了序列s[]的最大子段和。

    2.算法流程图

    三、代码编写

    package themax;
    
    import java.util.Scanner;
    
    public class TheSumMax {
    	public static int SumMax(int Max,int s[]) {
    		int i;
    		//Sum[]数组保存的是s[Max]各个元素的累加值,即最大子段和的候选值
    		int[] Sum = new int[255];
    		int max = 0;
    		//underzero记录的是s[Max]中小于等于0的元素的个数,若都是小于等于0的元素输出最大子段和为0
    		int underzero = 0;
    		for(i = 0;i < Max;i ++) {
    			Sum[max] = s[i];
    			if(s[i] <= 0) {
    				underzero ++;
    			}		
    			max ++;
    			for(int j = i + 1;j < Max;j ++) {
    				Sum[max] = Sum[max-1] + s[j];
    				max ++;
    			}
    		}
    		//MAXSUM为最大子段和
    		int MAXSUM;
    		if(underzero == Max) 
    			MAXSUM = 0;
    		else {
    			MAXSUM = Sum[0];
    			for(i = 1;i < max;i ++) {
    				if(MAXSUM < Sum[i])
    					MAXSUM = Sum[i];
    			}
    		}
    		return MAXSUM;
    		
    	}
    	
    	public static void main(String[] args) {
    		Scanner scan1 = new Scanner(System.in);
    		int n = scan1.nextInt();
    		int [] sum = new int[n];
    		Scanner scan2 = new Scanner(System.in);
    		for(int i = 0; i < n; i ++) {
    			sum[i] = scan2.nextInt();
    		}
    		System.out.println(SumMax(n,sum));
    	}
    }
    

    四、语句覆盖测试

    1.判定/条件覆盖方法

    该语句覆盖测试方法要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。。

    2.判断条件分析及测试用例的设计

    根据代码和流程图不难发现判断条件i < Max, j=i+1 < Max , i< max, 均为循环判定条件,即不管是什么测试用例,都会满足这三条判断条件的任何一种情况,所以我们设计的测试用例只需要能够覆盖s[i] <= 0,underzero = Max,MAXSUM <=Sum[i] 这三条判定条件就可以了。故设计了两条测试用例:(1)n = 4,sum[n] = {2,1,4,3} (2)n = 4,sum[n] = {-1,-2,-3,-4}

    3.测试代码及运行结果

    (1)n = 4,sum[n] = {2,1,4,3}
    测试代码
    package themax;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    
    class TheSumMaxTest {
    
    	@BeforeEach
    	void setUp() throws Exception {
    	}
    
    	@Test
    	void testSumMax() {
    		int Max = 4;
    		int[] s = {1,2,3,4};
    	}
    
    	@Test
    	void testMain() {
    		int n = 4;
    		int[] sum = {2,1,4,3};
    		assertEquals(10,new TheSumMax().SumMax(n, sum));
    	}
    
    }
    
    运行结果

    (2)n = 4,sum[n] = {-1,-2,-3,-4}
    测试代码
    package themax;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    
    class TheSumMax1Test {
    
    	@BeforeEach
    	void setUp() throws Exception {
    	}
    
    	@Test
    	void testSumMax() {
    		int Max = 4;
    		int[] s = {-1,-2,-3,-4};
    	}
    
    	@Test
    	void testMain() {
    		int n = 4;
    		int[] sum = {-1,-2,-3,-4};
    		assertEquals(0,new TheSumMax().SumMax(n, sum));
    	}
    
    }
    
    运行结果

    五、coding地址链接

    themax

  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/ych123123/p/8686730.html
Copyright © 2011-2022 走看看