演算法題 不等式數列

2021-08-02 00:10:01 字數 1620 閱讀 7706

度度熊最近對全排列特別感興趣,對於1到n的乙個排列,度度熊發現可以在中間根據大小關係插入合適的大於和小於符號(即 『>』 和 『<』 )使其成為乙個合法的不等式數列。但是現在度度熊手中只有k個小於符號即(『<」)和n-k-1個大於符號(即』>』),度度熊想知道對於1至n任意的排列中有多少個排列可以使用這些符號使其為合法的不等式數列。

輸入描述:

輸入包括一行,包含兩個整數n和k(k < n ≤ 1000)

輸出描述:

輸出滿足條件的排列數,答案對2017取模。

輸入例子:

5 2輸出例子:

66

使用dp[i][j] 表示n為i,k為j 時 合法排列的個數

當n從i增加到i+1時,分為兩種情況:

例如:dp[4][2] 的乙個排列為:

2>

1<

3<4

插入情況1有:

最左側:

5>

2>

1<

3<4

小於號:

2>

1<

3<

5>4

2>

1<

5>

3<4

插入情況2有:

最右側:

2>

1<

3<

4<5

大於號:

2<

5>

1<

3<4

」 「變為」(i-1)>」 或者 「<」 變為」<(i-1)>」:

增加了乙個大於號,而小於號個數不變;每個排列有j個小於號,加上最左側,共有(j+1)種插入方式: dp

[i+1

][j]

+=dp

[i][

j]∗(

j+1)

;

」 「變為」<(i-1)」 或者 「>」 變為」<(i-1)>」:

增加了乙個小於號,而大於號個數不變;每個排列有n-j-1個大於號,加上最右側,共有種(i-j-1+1)種插入方式:dp

[i+1

][j+

1]+=

dp[i

][j]

∗(i−

j);

初始邊界狀態:dp[1][0] = 1

#include 

#include

#include

#include

using

namespace

std;

//#define debug_

int func(int n,int k)

dp[1][0] = 1;

for (auto i = 0; i <= n;++i)

if (i+1

<=n&&j+1

<=k)}}

return dp[n][k]%2017;

}int main()

不等式數列

不等式數列 時間限制 1秒 空間限制 32768k 度度熊最近對全排列特別感興趣,對於 1到n的乙個排列 度度熊發現可以在中間根據大小關係插入合適的大於和小於符號 即 和 使其成為乙個合法的不等式數列。但是現在度度熊手中只有 k個小於符號即 和n k 1 個大於符號 即 度度熊想知道對於1至 n任意...

不等式數列 DP

度度熊最近對全排列特別感興趣,對於1到n的乙個排列,度度熊發現可以在中間根據大小關係插入合適的大於和小於符號 即 和 使其成為乙個合法的不等式數列。但是現在度度熊手中只有k個小於符號即 和n k 1個大於符號 即 度度熊想知道對於1至n任意的排列中有多少個排列可以使用這些符號使其為合法的不等式數列。...

不等號屬於不等式嗎 實數(等式和不等式)

在高中數學的第二章,a版教材稱其為一元二次函式 方程和不等式,而b版教材僅稱其為等式和不等式,這不是說a版教材的內容豐富,反而是說b版教材更突出數學的一般性。不論你學哪一版本,都應該把這一章的內容在本質上看作是實數,等式 不等式的性質,乃至一元二次方程和不等式,都是實數性質的體現。在現代數學,我們有...