對於乙個數列,如果有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從陣列開頭開始,另乙個迴圈...