ソル
F [i]はi番目の格子が行ったときに得られる最大スコアを表します
数に関連する各カードをクロール転移、わずか4枚のカードの合計
だから、4枚のカードはまた、[I] [A] [B] [C] [D] fは、シートの状態番号に入れている入れ...
見つかりました知っている、Fのみ残しiは減算さ寸法ようにiが知られているB、C、D、[A] [B] [C] [D]
要約すると、最終的な状態は、[A]はFであり、[B]、[C]、[D] 1 .....最大スコアカード2 Bで、得られたシートをシートのカードを表します
転送することができ、カードの使用を列挙するために転送
コード
1の#include <iostreamの> 2の#include <cstdioを> 3 の#define行く(私は、u、v)がため(; I <= V iは++ INT I = Uレジスタ) 4 使用して 名前空間STDを、 5 int型リード() 6 { 7 INT X = 0、Y = 1。チャー C = GETCHAR()。 8 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();} 9 しばらく(> = C ' 0 ' && C <= ' 9 '){X =(x << 3)+(X << 1)+ C- ' 0 ' ; C = GETCHAR();} 10 リターンのx *のY。 11 } 12 int型 N、M、[CD 5 ]、皮下[ 360 ]、F [ 50 ] [ 50 ] [ 50 ] [ 50 ]。 13 のint main()の 14 { 15 N =(読み取り); M = (読み取り) 16 ゴー(I、1、n)はSC [I] =読む(); 17 ゴー(I、1、M){ int型のx =リード(); CD [X] ++ ;} 18 F [ 0 ] [ 0 ] [ 0 ] [ 0 ] = SC [ 1 ]。 19 ゴー(0は、CDが[ 1 ])行く(B、0、CD [ 2 ]) 20 ゴー(C、0、CD [ 3 ])行く(D、0、CD [ 4 ]){ 21 、INT X = * 1 + B * 2 + C * 3 + D * 4 + 1 。 22 であれば(A> 0)F [A] [B] [C] [D] = MAX(F [A] [B] [C] [D]、F [A- 1 ] [B] [C] [ D] + SC [X])。 23 であれば(B> 0)F [A] [B] [C] [D] = MAX(F [A] [B] [C] [D]、F [A] [B- 1 ] [C] [ D] + SC [X])。 24 場合(C> 0)F [A] [B] [C] [D] = MAX(F [A] [B] [C] [D]、F [A] [B] [C- 1 ] [ D] + SC [X])。 25 であれば(D> 0)F [A] [B] [C] [D] = MAX(F [A] [B] [C] [D]、F [A] [B] [C] [D- 1 ] + SC [X])。 26 } 27 のprintf(" %dの"、F [CD [ 1 ] [CD [ 2] [CD [ 3 ] [CD [ 4 ])。 28 リターン 0 ; 29 }