[ダイナミックプログラミング]数学の呪い

[ソース]: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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Osea/p/11297908.html