おそらく、分析的に分析して O(1) ソリューションを考え出す方法があります。ただし、それを理解するには、私よりもはるかに賢い人が必要です:) これが動的プログラミングのソリューションです。
このソリューションでは、すべての値が正でなければならないと仮定しています。さらに、シーケンス内のすべての値が前の値と等しくない必要があると想定しています。これらの条件は両方とも暗示されているように見えますが、質問では明示的に述べられていません.
まず、 、 、、に加えてN
、シーケンスの最後の項 a nの値も与えられるように、問題を少し変更してみましょう。また、最後の項が増加または減少シーケンスの一部であったかどうかを表す、さらに別の変数を追加しましょう。次に、これらすべての値が与えられた場合に可能なシーケンスの数を返す関数を定義します。M
K
L
I
F
N = 連続する値の数
M = シーケンスの「実行」数
K = 許可される最大値
L = 隣接するシーケンス項間の最大差
I = 最終項が増加しているか減少しているか
a n = シーケンスの最後の用語
F K,L (N,M,I,a n ) = これらすべての値が与えられた場合の可能なシーケンスの数
を計算する方法があれば、a n (1 から K まで)のF
すべての可能な値を合計して、問題の答えを得ることができます。 I
I = 「増加する」と仮定しましょう。F K,L (N,M,"increasing",a n )を の「小さい」値で表現したいF
ので、 の値を再帰的に計算F
して最終値を得ることができます。これを行うには、 a n-1F
のすべての可能な値の値を合計します。つまり、基本的に、 はnで終わる可能性のある長さの有効なシーケンスの数に等しいと言い、それぞれにnを追加することを想像します。F
N-1
a nは増加するシーケンス(I = "increasing")の一部であることがわかっているため、a n-1 < a n (すぐに他のケースに進みます)であることがわかります。また、n-1 は n-1の範囲L
内になければならないこともわかっています。したがって、max(1, a n - L) <= a n-1 < a nです。
前項a n-1が増加しているか減少しているかに応じて、次の 2 つのケースを考慮する必要があります。
- n-1が増加していました。その後、まだ増加しているので、
F
関心のある値は
F K,L (N-1,M,"increasing",a n-1 )です。
- a n-1は減少していました。 a nは現在増加しているため、値の「実行」がもう 1 つあります。したがって、
F
関心のある の値は
F K,L (N-1,M-1,"decreising",a n-1 )です。
F K,L (N,M,"increasing",a n )の値を取得するために、a n-1のすべての可能な値についてこれらすべてのケースを合計します。同様の方法でF K,L (N,M,"decreising",a n )を見つけることができますが、 a n-1をa n < a n-1 <= min(K, a n +L)に制限するだけです。 、ケース #2 ではなくケース # 1 から 1 を引きます。M
最後に、基本ケースを示します。 F K,L (N,M,I,a n ): M < 1 または M > N の場合は 0。N = 1 の場合は 1。
次に、上で述べたように、 F K,L (N,M,I,a n ) の と a n のすべての値を合計して、元の問題に対する答えI
を取得します。実行時の複雑さはO(KMN)