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 }