248:
タイトル説明
ベッシーは彼女が彼女の大きなひづめで使用する、むしろ厄介小さなタッチスクリーンをdoesfindにもかかわらず、彼女の携帯電話で再生するゲームをダウンロードして好きです。
彼女は特に彼女がplaying.Theゲームである現在のゲームに興味をそそられるが、一連のから始まる N Nは正の整数(2 \当量のN \の当量248 2 ≤ N ≤ 2 4 の範囲で8)、各 1 \ ldots 40 1 ... 4 0は、一つの動きで、ベッシーは、同じ値を有する2つの隣接する数字をcantake、それらに値1以上(例えば、彼女は8 7swith隣り合うを置き換える可能性がある)のsinglenumberを置き換えます。目標は、ゲーム終了時にシーケンス内の最大numberpresentの価値を最大化することです。できるだけ高度Bessiescoreを助けてください!
遊びの内側2048年における1 * nのマップは、次の2つの隣接する(値の範囲1-40)をマージすることができ、すべての時間を考えると、最大で収まることができますどのくらい尋ねました。値が2倍されないが、マージされた+1、例えば、値2 2 3合併しました。
入力形式
入力の最初の行は含ま N Nを、次の N Nラインが配列を与えます
N 、ゲームの開始時にN番号。
出力フォーマット
出力にベッシーが生成できる最大の整数をしてください。
サンプル入力と出力
4 1 1 1 2
3
説明/ヒント
ここに示す例では、ベッシーは、最初に第二および第三1Sをマージ
シーケンス1 2 2を取得し、その後、彼女はそれがあることに留意されたいに2Sをマージ
最初の2 1Sに参加する最適ではありません。
262144:
タイトル説明
ベッシーは彼女が彼女の大きなひづめで使用する、むしろ厄介小さなタッチスクリーンをdoesfindにもかかわらず、彼女の携帯電話で再生するゲームをダウンロードして好きです。
彼女はplaying.Theゲームのシーケンスで開始され、現在のゲームによって特に興味をそそらである N (Nは正の整数2 \当量N \の当量262,144 2 ≤ N ≤ 2 6 2 、1 4 の範囲内のそれぞれの、4) 1 \ 40 ldots 1 ... 4 一手では0を、Bessiecanは同じ値と隣接する二つの数字を取り、それらに値1以上(例えば、彼女は8とtwoadjacentの7Sを置き換える可能性がある)の単一の番号を交換してください。目標は、ゲーム終了時に順番にthelargest数存在の価値を最大化することです。Pleasehelpベッシーは、可能な限りの高得点します!
ベッシーは上下(......)電話でゲームをプレイしたいが、彼女はそれが非常に難しいの上の小さな携帯電話の画面で動作するように詰め掛け。
彼女は正の整数n、(2 <= N <= 262144)、1〜40の範囲があるゲームのゲーム魅了始まりを果たした最近でした。一の工程で、二つの隣接するBessey同じ数から選択することができ、その後(例えば2は、1つの8 7にまとめ)元の数よりも最初の年にマージ、目標は、最大数の最大値は、ベッシーを助けてくださいようなものです最大を追求します。
入力形式
入力の最初の行は含ま N Nを、次の N Nラインが配列を与えます
N 、ゲームの開始時にN番号。
出力フォーマット
出力にベッシーが生成できる最大の整数をしてください。
サンプル入力と出力
4 1 1 1 2
3
説明/ヒント
ここに示す例では、ベッシーは、最初に第二および第三1Sをマージ
シーケンス1 2 2を取得し、その後、彼女はそれがあることに留意されたいに2Sをマージ
最初の2 1Sに参加する最適ではありません。
--------------------------分割ライン---------------------- ------
一見すると、これら二つのトピックは、1一見0--248で、データのみが同じではないことを見つけるために、(実際には、本当によくほぼ)同じであるように思わ、1です1--262144
名前はまた、その方法は、最初のタイトル曲セットがループを3倍にすることができますことは明らかであるタイトルで、タイムアウトはありません
最初の質問のコード(これは......それを言うまでもなく必要があります)
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INT番号、NUM [ 302 ]、DP [ 302 ] [ 302 ]、ANS = - 1E9。 int型読み取り(){ int型、S = 0、W = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(== CH ' - ')W = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <=' 9 ')S = sの* 10 + CH- ' 0 '、CH = GETCHAR()。 リターンの* ワット。 } int型のmain(){ 数 = リード()。 用(int型 I = 1)(NUM [i]を読み出す= DP [i]は[I] =; iが<=番号iが++)はNUM [I]。 以下のために(int型 I = number- 1 ; I> = 1 ; i-- ) のために(int型 J = iは+ 1、J <=数; J ++ ) のための(INT K = I、K <Jあり、k ++){ 場合(DP [I] [K] == DP [K + 1 ] [J])DP [I] [J] = MAX(DP [I]、[J]、DP [I] [K] + 1) 、ANS = MAX(ANS、DP [I] [J])。 } COUT << ANS。 リターン 0 ; }
さて、それから2番目の質問です
最初の質問は262144 ^ 3億人以上、残業、およびDP肯定的である場合ハイパースペースは、[262144] [262144]もまた、使用される方法であります
そして、それは新しい方法でなければなりません(まだかかわらず、DP)
定義:DP [I] [J] jは、左の点で表現され、あまりにも面倒を見て右の点Iの合成は、単純な言語、左の点j、右DPをポイントし、[I] [J]で表されます、合成部のI
その後、転送方程式は動的DP [I] [J] = DP [I-1] [DP [I-1]〜[J]導出することができます
次いで、[I-1]をDP、DP [I-1] [j]は合成することができ、言葉で表現するために、より困難にI-1の右端を表すことができる[DP [I-1]〜[J]であります点の左端の右側に点I-1の右端部の合成
キャプション付き、発音によく、少し難しいです
手は、DP左端ポイントに[I-1]を[J] =次いで4,4ので、セクション3は、合成することが可能である点が区間[3,4] 3を合成することができる3の左側に、決定することができます[4,6]、及び3 iがマージしていない2つのセクション後の値
この式の右端になるように、私は右端の4の合成I-1における左端の点で合成区間の右端には、左端点は、jは
コードの場合:
// DP の#include <ビット/ STDC ++ H> 使用して名前空間STDを、INT番号、NUM [ 262145 ]、DP [ 60 ] [ 262145 ]、ANS = 0 。int型読み取り(){ int型、S = 0、W = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(== CH ' - ')W = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 ')S = sの* 10 + CH- ' 0 '、CH = GETCHAR()。 リターンの* ワット。 } int型のmain(){ 数 = リード()。 以下のために(int型 i = 1 ; iが<=数、iは++)NUMを[I] =を読み出し()、DP [NUM [I] [I] = I + 1 。 以下のために(int型 I = 2、iは<= 58 ; iが++ ) のための(INT J = 1 ; J <=数; J ++ ){ もし(!DP [I] [J])DP [I] [J] = DP [I- 1 ] [DP [I- 1 ] [J]。 もし(DP [I] [J])ANS = I。 } COUT << ANS。 リターン 0 ; }