軟體工程(2019)第三次個人作業

2022-09-02 01:18:13 字數 1604 閱讀 5969

問題: 給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: max,1<=i<=j<=n

例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20。

要求乙個陣列中的最大子段和,可以想到若記b[j]=max(a[i]+a[i+1]+..+a[j]),其中1<=i<=j,並且i<=j<=n。則所求的最大子段和為max b[j],1<=j<=n。

由b[j]的定義可易知,當b[j-1]>0時b[j]=b[j-1]+a[j],否則b[j]=a[j]。故b[j]的遞推方程為:b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。我在這個問題中採用了上面的遞推法。

#include#includeint a[100];

int summ(int a, int n)

if (sum<0)

}return maxx;

}int main()

sum = summ(a, n);

if (sum == 0) printf("最大子段和為0");

else printf("最大子段和為%d\n", sum);

return 0;

}

初始**提交至coding.net中:

#include "../project/標頭.h"

using namespace microsoft::visualstudio::cppunittestframework;

namespace unittest

; assert::areequal(summ(a,0), 0);

} test_method(testmethod2)

; assert::areequal(summ(a,5), 0);

} test_method(testmethod3)

; assert::areequal(summ(a,5), 0);

} test_method(testmethod4)

; assert::areequal(summ(a,5), 15);

} test_method(testmethod5)

; assert::areequal(summ(a,5), 7);

} test_method(testmethod6)

; assert::areequal(summ(a,5), 9);

} };

}初始**中我用的變數基本都是全域性定義,執行**能得到正確值,但是在單元測試中一直不成功,然後我又進一步改寫**把變數基本定義在函式內,從而解決了問題。

通過這兩次的單元測試作業,我懂得了變數的運用,掌握了單元測試基本要領,對vs2017運用的也更加的熟練。

軟體工程(2019)第三次作業

給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n 例如,當 a 1 a 2 a 3 a 4 a 5 a 6 2,11,4,13,5,2 時...

軟體工程(2019)第三次作業

這道題是乙個動態規劃問題,可以使用分治法和遞推法解決。我使用的是遞推法。coding位址 def deal arrlist list int param arrlist 傳入數列,引數型別為列表 return 最大子陣列之和 flag true if len arrlist 0 return 0 f...

軟體工程(2019)第三次作業

1 首先定義子陣列和以及最大子陣列和為零 陣列下標i 0 2 i是否大於陣列長度?否 進行 3 是 返回最大子陣列和,結束!3 取第i個陣列值,子陣列和 子陣列和 第一i個陣列值。進行 4 4 比較子陣列和與最大陣列和大小,如果子陣列和大,最大陣列和值取為子陣列和值 如果子陣列和小,子陣列和重新歸零...