[DP] CF455A退屈

A.退屈

アレックスは退屈が好きではありません。彼は飽きたときに、彼はゲームを思いつく理由です。一つの長い冬の夜、彼はゲームを思い付いたし、それを再生することを決めました。

シーケンスを考えると   からなる  n個の  整数を。プレイヤーは、いくつかのステップを行うことができます。単一のステップでは、彼はシーケンスの要素を選択することができます(のは、それ表すと  Kと等しく、すべての要素ということで、それを削除)  のk  + 1、  kの  1はまた、シーケンスから削除する必要があります- 。そのステップはもたらし  k個の  プレイヤーにポイントを。

アレックスは完璧主義者であるので、彼はできるだけ多くのポイントを取得することを決めました。彼を助けて。

入力

最初の行は、整数含ま  N  (1≤  nは  10≤ アレックスのシーケンスであるか多くの番号を示し5)。

2行目は含まれ  、nが  整数  1、  2、...、  N  (≤1  iは  ≦10 5)。

出力

アレックスは稼ぐことができるポイントの最大数 - 単一の整数を出力します。

正解:

最初に、[K]である間隔DP、省略したと考え、[K + 1]及び[K-1]の数も省略します。

しかし、開区間配列1E5は劣らを開けない、もっと良い方法があることが、問題の解決策を参照してください。

だから、......間違ったトピック

これは、特定の数、+ 1及び-1を削除しなければならないの欠失です。

我々は、F [i]は、iの最大値の最大値である設定します。

私は削除されない場合、その後、F [I] = F [I-1]

若把i删除,f[i]=f[i-2]+cnt[i]*i;   

(I-1を選択することができない私を削除した後、それが必要である[I-2]開始から転送されF)

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <アルゴリズム>
 4の#include <iostreamの>
 5の#include < ストリング >
 6の#include <地図>
 7の#include < 設定 >
 8の#include <ベクトル>
 9# <キュー>含む
 10の#include <cmath>
 11の#include <cstdlib>
 12の#include <積層>
 13  の#define:ドのprintf( "の\ n \のNDEBUG")
 14  の#defineエンドのprintf( "\のNENDする\ n \ n"は
) 15  の#define Fiの第
 16  の#defineSE第
 17  の#define P対<整数、整数>
 18  の#define PII対<ペア<整数、整数>、整数>
 19  の#define 0x3f3f3f3f INF
 20  使って 名前空間STDを、
21のtypedef 長い LL。
22  CONST LL MOD = 十億七23  のconst  int型 N = 100000 + 100 24  CONST  INT INF = 0x7FFFFFFFで25  int型N、[N]、MAXX。
26  LLのCNT [N]。
27  LLのF [N]。
28  のint main()の
 29  {
 30      のscanf(" %d個"、&N)
31      のためには、int型 i = 1 ; iが<= N; iが++ 32      {
 33          のscanf(" %dの"、および[I])。
34          MAXX = MAX(MAXX、[I])。
35          CNT [I]] ++ ;
36      }
 37      F [ 0 ] = 0 38      F [ 1 ] = CNT [ 1 ]。
39     int型 iは= 2 ; I <= MAXX iが++ 40          F [I] = MAX([I-F 1 ]、[I-F 2 ] + CNT [I] * I)。
41      のprintf(" %LLDする\ n " 、F [MAXX])。
42  
43  
44  
45      戻り 0 ;
46 }
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/Kaike/p/11260597.html