最大连续子数组和
问题: 给定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。
题意:
含有N个数的数组,求最大的连续子段的和,动态规划:递推公式是dp[i] = max{dp[i-1] + arr[i],arr[i]}
参考代码:
Github地址:
1 public class dp { 2 public int max_string(int arr[]){ 3 if(arr == null || arr.length <= 0){ 4 return 0; 5 } 6 int len = arr.length; 7 int Max=0x8000000; 8 int this_max=0; 9 for(int i=0; i0?this_max+arr[i]:0);11 }12 return Max;13 }
单元测试
1.覆盖标准
条件组合覆盖:使得每个判定中条件的各种可能组合都至少出现一次。
2.流程图:
3.测试代码:
1 public class dp_test { 2 dp d = null; 3 @Before 4 public void set_up(){ 5 d = new dp(); 6 } 7 @Test 8 public void test_1() { 9 int arr[]={-1,-1,-1,-1,-1};10 Assert.assertEquals(d.max_string(arr), 0);11 }12 @Test13 public void test_2() {14 int arr[]={0,0,0,0,0};15 Assert.assertEquals(d.max_string(arr), 0);16 }17 @Test18 public void test_3() {19 int arr[]={1,2,3,4,5};20 Assert.assertEquals(d.max_string(arr), 15);21 }22 @Test23 public void test_4() {24 int arr[]={-2,11,-4,13,-5,-2};25 Assert.assertEquals(d.max_string(arr), 20);26 }27 @Test28 public void test_5() {29 int arr[]={1,2,-4,8,-1};30 Assert.assertEquals(d.max_string(arr), 8);31 }32 33 }
4.测试结果