5214最も長いシーケンス与え違い

  この質問は、もっと面白い、彼らは多くの良い地図になり、C ++と言うが、またスペースを節約できますが、私は(仲間の興味、そして自己実現)ではない、ああしないからです。

 

 

  問題の再発、tはので、私はああ配列のインデックスが、これはクールを行うことができますどのように、負になることができない、実装するための配列を使用しますが、負のああを持つことができ、C ++の地図ではありませんので。直接的暴力の簡単な方法は、プラス最大境界値、オープン2倍で、同等の配列は、シンボルを削除します。今回我々は、DPの私達の配列のうちことができます。それは再帰的であるので、あなたは、漸化式を持っている必要があります。これは、最長漢漢漢が蓄積1の段階で何度も何度もその関係はありませんが、また非常に簡単ですか?しかし、また、最長、あなたは確かに最高の機能を持っていなければなりませんでした。我々は、DP [i]が現在のシーケンス番号iが最大で最後のサブシーケンスで表す設定我々はiが前回後++、長さ毎にその比較用の「最大値」、中間切断場合、最後ので、「ステップにより決定される「インデックスの最大値は、固定値の段階で、自動的に再集計を切断します。我々は非常に簡単に状態遷移方程式を書くことができ、このルールを持っています

DP [I] = MAX(DP [I]、DP [I-差] +1)。

  もちろん、これは単なるダイナミックな伝達方程式で、まだ具体的な変更を実装する必要があります。どうやって達成しようとした後、コードを見て所有することができます。

1  / * *
 2  差所与* @brief最長シーケンス
 3。 * @note 10000を追加する必要があります 
 4。 * @paramのARRを:指定された順序で
 5。 * @param arrSize:配列の長さ
 。6  * @paramの-difference:ソリッド固定差分
 7  *ジェンヤン@author小さなファン兄弟 
 8。  * / 
9。 INT longestSubsequence(INT * ARR、INT arrSize、INT -difference){
 10      INT ANS = 0 ;
 11      INT DP [ 20002 ] = { 0 };
 12である     ためINT I = 0; 私はarrSizeを<; I ++ 13      {
 14          ARR [I] + = 10000 15      }
 16      
17      のためにint型 i = 0 ; I <arrSize; iは++ 18      {
 19          int型の和= ARRの[I] - 差異;
20          であれば(和> 20000 ||和< 0 21          {
 22              DP [ARR [I] = 1 23          }
 24          他の
25          {
 26             >(DP [和] + [I] ARR] = DP [i]はARR] DP 1)?DP [ARR [I]:(DP [和] + 1 )。
27          }
 28          ANS = ANS> DP [i]を[ARR]?ANS:DP [i]の[着];
29          のprintf(" %d個の\ n " 、ANS)。
30      }
 31の     
32      戻りANS。
33 }
コードの表示

  レースウィークは容易ではない、紳士は、お互いを励まします!

おすすめ

転載: www.cnblogs.com/daker-code/p/11627391.html