この質問は、もっと面白い、彼らは多くの良い地図になり、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 }
レースウィークは容易ではない、紳士は、お互いを励まします!