問題: 給定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 比較子陣列和與最大陣列和大小,如果子陣列和大,最大陣列和值取為子陣列和值 如果子陣列和小,子陣列和重新歸零...