软件工程第三次作业(最长子段和)


最大子段和的算法并进行条件组合覆盖测试

给定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)、算法:

  此问题我利用动态规划来解决,将整个问题分解为逐个小问题来解决,思想是遍历一遍整个数组寻求多阶段决策过程的最优化问题。

时间复杂度:O(N)

(2)、流程图:

1522246657x-1376440138.png


二、 代码部分

(1)、核心算法部分代码

    public static int Calu(int[] arr)
    {
        max=0;
        int n=arr.length;
        int dp[]=new int[100];
        dp[0]=arr[0];
        if(dp[0]>=0)
            max=dp[0];
        for(int i=1;i<n;i++){
            if(dp[i-1] > 0)
                dp[i]= dp[i-1] + arr[i];
            else
                dp[i]=arr[i];
            if(dp[i] > max)
                max=dp[i];
        }
        return max;
    }

(2)、实现判定条件覆盖测试

首先进行基本简单数值测试:
    @Test
    public void test1(){           //作业测试数据
        int arr[] = {-2,11,-4,13,-5,-2};
        int ans = 20;
        assertEquals(ans, new maximum().Calu(arr));
    }
    @Test
    public void test2(){           //全正数测试
         int arr[] = {1,2,3,4};
            int ans = 10;
        assertEquals(ans, new maximum().Calu(arr));
    }
    @Test
    public void test3(){           //全负数测试
         int arr[] = {-1,-32,-2,-8,-7};
            int ans = 0;
        assertEquals(ans, new maximum().Calu(arr));
    }

1522247777x-1566688305.png
测试成功。

何谓条件条件组合覆盖?

条件组合覆盖:选择足够的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

为解释说明,下面贴上一张网上的参考图片:
831031-20151110145357744-1360520142.png
参考图片来源

因此,对于AB,CD两组条件,我们将有2*2=4种条件组合,因此我们设立能覆盖4种条件组合的用例。

    @Test
    public void test4(){           //覆盖测试
         int arr[] = {7,0,6,-1,1,-6,7,-5};
            int ans = 14;
        assertEquals(ans, new maximum().Calu(arr));
    }

1522331599x-1404755648.png

测试成功。


三、总结:

1、本次作业让我更加熟悉了coding等git代码网站的使用。

2、良好的算法带来的运算效率是关键的,是我们程序员需要研究的。

3、个人而言编代码的时间远小于为写博客,到处找资料去佐证,去研究条件组合覆盖的时间。


四、代码

代码已经上传至Coding

转载于:https://www.cnblogs.com/heshengyuan1311/p/8672756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值