[ソース]:2018 B焦作市のネットワークゲーム
[タイトル]に意図されています。
n個の数字がありますが、象徴的にMがあります。振り返るしないことにより(すなわち、番号選択シーケンシャル話すのM)、魔法の除去、および最大値。
実際には、いくつかの手段がアレイ状に配列を選択することであり、m及び算術演算です。最後に、答えが最大化されています。
[思考]:
複雑であるDP、我々は唯一の加算と減算を検討する際に考慮する必要があり、最大でもよいが、二つの操作乗算や除算することができ、被写体に参加することを検討してください。
その後、我々はまた、最小値から転送することができる、すべての値が上で最大から転送することができますので、最大値と最小値を記録する必要があります。
それは同時に記録する必要があります。
[注]:
1、(データセット)を初期化するために覚えています
実際に、私はそこに着く前に、我々は唯一の最大数を気に、私たちは圧縮する必要がある2は、直接転送はO(N ^ 2)の費用がかかります場合は、前者のステージングデジタル値が更新されます。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4 のconst int型 N = 1E4 + 10 。 5 のconst int型の M = 6 。 6 CONST LL INF = 0x7fffffffffffffff 。 7 LL DP [N] [M] [ 2 ]。// 0_最小值、1最大值 8 [N] LL。 9 INT メイン(){ 10 INT T。 11 int型N、M、K。 12 文字オプト[M]; 13 のため(のscanf(" %dの" ; T T--、&T){) 14 のscanf(" %D%D%D "、&N、&M、およびK); 15 のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %のLLD "、および[I])。 16 のscanf(" %sの"、OPT + 1 )。 17 18 のために(int型 i = 0 ; iがn = <; iは++ ){ 19 のために(INT J =0 ; J <= Mであり、j ++ ){ 20 、DP [I] [J] [ 0 ] = INF。 21 DP [I] [J] [ 1 ] = - INF。 22 } 23 } 24 25の ための(int型 I = 0 ; iが<= N; iが++ ){ 26 、DP [I] [ 0 ] [ 0 ] = DP [I] [ 0 ] [ 1 ] = K。 27 } 28 29 30 用(INT J = 1 ; J <= M; J ++){ 31 のための(int型 I = 1を iが<= N; iが++ ){ 32 であれば(I> J){ 33 、DP [I] [J] [ 0 ] = DP [I- 1 ] [j] [ 0 ] ; 34 DP [I] [j]を[ 1 ] = DP [I- 1 ] [J] [ 1 ]。 35 } 36 37 であれば(OPT [J] == ' + ' ){ 38 、DP [I] [J] [ 0 ] =分(DP [I] [J] [ 0 ]、DP [I- 1] [J- 1 ] [ 0 ] + [I])。 39 DP [I] [J] [ 0 ] =分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 1 ] + [I])。 40 41 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1 ] [J- 1 ] [ 0 ] + [I])。 42 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1 ] [J- 1 ] [ 1 ] +[I])。 43 } そう であれば(OPT [J] == ' - ' ){ 44 、DP [I] [J] [ 0 ] =分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 0 ] - [I])。 45 DP [I] [J] [ 0 ] =分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 1 ] - [I])。 46 47 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1] [J- 1 ] [ 0 ] - [I])。 48 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1 ] [J- 1 ] [ 1 ] - [I])。 49 } そう であれば(OPT [J] == ' * ' ){ 50 、DP [I] [J] [ 0 ] =分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 0 ] * [I])。 51 DP [I] [J] [ 0=分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 1 ] * [I])。 52 53 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1 ] [J- 1 ] [ 0 ] * [I])。 54 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1 ] [J- 1 ] [ 1 ] * [I])。 55 } 他{ 56 DP [I] [J] [ 0=分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 0 ] / [I])。 57 DP [I] [J] [ 0 ] =分(DP [I] [J] [ 0 ]、DP [I- 1 ] [J- 1 ] [ 1 ] / [I])。 58 59 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1 ] [J- 1 ] [ 0 ] / [I])。 60 DP [I] [J] [ 1 ] = MAX(DP [I] [J] [ 1 ]、DP [I- 1] [J- 1 ] [ 1 ] / [I])。 61 } 62 } 63 } 64 65 のprintf(" %LLDする\ n "、DP [n]は[M] [ 1 ])。 66 } 67 リターン 0 。 68 }