次のように低いバージョンの問題を解決する方法同様のアプローチにおいて、DP [k]が得られます。
そして、バックステッピングを好きに0からkを
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 のconst int型 MX = 105 。 4 二重DP [MX]。 5 INT X [MX]。 6 INT メイン(){ 7 INT T、N、K。 8 のscanf(" %dの"、&T)。 9 用(INT CAS = 1 ; CAS <= T; CAS ++ ){ 10 のmemset(DP、0、はsizeof (DP))。 11 のscanf("%D%D "&N& K); 12 int型 A = 0 、B; 13 二重 SUM1 = 0、SUM2 = 0 ; 14 用の(int型 i = 0 ; iがn <; iは++ ){ 15 のscanf(" % D 」、およびX [i])と、 16 であれば(X [i]が> 0){SUM1 + = X [i]は、++ ;} 17 他 SUM2 + = ABS(X [I]); 18 } 19 であれば(= = 0 ){ 20 printf(" ケース%D:-1 \ nを" 、CAS); 21 続け; 22 } 図23は、 B = N- 。 24 であれば(A)SUM1 / = 。 25 であれば(B)SUM2 / = B。 26 K = 分(K、B)。 27 DP [K] = SUM1 +(BK)* SUM2 / 。 28 のためには、(int型 I = K- 1、I> = 0 ; i-- ){ 29 、DP [I] =(DP [I + 1 ] + SUM2)*(B- I)。 30 DP [I] + = SUM1 *A; 31 DP [I] / = N- I。 32 } 33 のprintf(" ケース%のD:%.7f \ n "、CAS、DP [ 0 ])。 34 } 35 リターン 0 。 36 }