dp 逆序數序列

2022-06-27 03:39:07 字數 782 閱讀 2866

對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1~n自然數組成的

數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?

input

第一行為兩個整數n,k。

output

寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對10000求餘數後的結果。

sample input

4 1sample output

3 樣例說明: 下列3個數列逆序對數都為1;分別是1 2 4 3 ;1 3 2 4 ;2 1 3 4; 100%的資料 n<=1000,k<=1000

題意:讓你求長度為 n 的序列逆序數為k的有多少種情況

思路分析:考慮在增加一位,第 i 位時,就相當於在長度為i-1的序列全排列中插入以個 i ,由於插入的 i 值是最大的,因此其可以增加的逆序數數量為 0~i-1 ,當將 i 插入到最末尾時,不會增加任何逆序數,當插入到倒數第二位時,會增加一位逆序數,就這樣推一下就可以了。

定義 dp[i][j] 長度為 i 的序列逆序數為 j 的方案總數,在累加求和時要用字首和優化一下

**示例:

int dp[1005][1005];

int sum[1005];

int main()

sum[0] = 1;

for(int j = 1; j <= k; j++)

}printf("%d\n", dp[n][k]);

return 0;

}

求序列逆序數

由1,2,n 組成的乙個有序陣列稱為乙個n級排列。在乙個排列中如果一對數的前後位置與大小順 序相反,即大數排在小數的前面,則稱它們為乙個逆序。乙個排列中所有逆序的總和稱為該排列的逆序數。那麼,如何求解乙個序列的逆序數呢?暴力法是問題解的最簡單的方法,下面給出核心 int inversionnumbe...

求序列逆序數

求序列逆序數 整體思路是用到分治的思想,其實該問題可以在歸併排序過程中解決,因此該題 只需要在歸併排序 上增加乙個變數記錄逆序數即可,但正如那個修機器的故事一樣,換釘子不難,但知道在 換釘子卻是非常關鍵。如下,只是在歸併排序的基礎上增加了乙個記錄逆序數的地方 void reverse int num...

求序列的逆序數

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。即,在陣列中,若0 a j 就說明這兩個數是逆序對,乙個陣列中逆序對數量就是逆序數。第一種思路 用兩個for迴圈解決,用第乙個迴圈i從陣列開頭開始,另乙個迴圈...