題目詳情
把n各事物的集合劃分成k個非空子集的方式數,比如劃分2個非空子集,我們可以得到7種劃分方式:
u;u;u;u;u;u;u.相信大家一看就知道這
個怎麼做吧,因為這就是著名的striling數.但是今天的問題卻是,計算n個元素安排城k個輪換(而不是子集)的
方式數.輪換是迴圈排列,也就是[a,b,c,d]=[b,c,d,a]=[c,d,a,b]=[d,a,b,c];而另一方面輪換[a,b,c,d]不同
於[a,b,d,c]或[d,c,b,a].那麼比如給定四個元素[1,2,3,4]我們可以得到11種不同方式形成2個輪換:[1,2,3][4];
[1,2,4][3];[1,3,4][2];[2,3,4][1];[1,3,2][4];[1,4,2][3];[1,4,3][2];[2,4,3][1];[1,2][3,4];[1,3][2,4];[1,4][2,3] 現在
給出n個元素,求出k個非空的輪換數
輸入格式:
多組資料,每組資料一行包含兩個整數,n和k (1<=k<=n<=500)。
輸出格式:
結果對2014取餘數的最終結果
答題說明
輸入樣例
1 1輸出樣例:
1思路:動態規劃。對於每個輪換,我們可以將它旋轉使它裡面的最小元素在最前面,稱這種形式為最小表示。
判斷兩個輪換是否相同只需要通過旋轉把它們裡面最小的元素移到最前面,然後看最小表示是否相同。n個元
素的k輪換,假設這k個輪換每個輪換的最小元素是mi,其中1<=i<=k,由於輪換與輪換之間的位置無關,所
以我們假設對於i < j, 有mi < mj,則1到mj - 1這些元素肯定不在第j個輪換,假設k個輪換的元素從左到右存
放在陣列array[n]當中。假設dp[i][j]表示前i個元素形成j個輪換的數量,則有可能前j-1個元素形成了前j-1個輪
換,或者前j個元素形成了前j-1個輪換,或者前j+1......。假設前t個元素形成了前j-1個輪換,那麼對於第j個輪換
最小元素為t+1,對於後面的t+2到i這些元素,由於他們的擺放對j個輪換的最小元素沒有影響,所以他們可以隨
意擺放,即我們可以先將它們擺放在陣列array中,所以有遞推公式:
源**(c++):
歡樂暑假線上程式設計比賽第四題 分配糖果
在csdn上看到這麼個題目,與友友們一起分享下,如果有別的做法,也希望能拿出來交流交流。題目詳情 有n個小朋友站成一排 編號從0到n 1 每個小朋友有乙個rating值,存放在ratings陣列中。老師需要給他們分 配糖果,每個小朋友至少需要一顆糖果,對於任意相鄰的兩個小朋友i和i 1,rating...
歡樂暑假線上程式設計比賽第一題 拆點遊戲
題目 n個節點,m條邊的無向圖,每個節點乙個權值w。定義拆除乙個節點的代價為與其相鄰的節點的權值之和。拆除乙個節點後刪除所有與該節點相連的邊。求拆除所有節點需要花費的最少代價。輸入描述 輸入包含多組測試資料,每組測試資料第一行先輸入n,m 1 n 10000 0 m 20000 第二行輸入n個整數w...
歡樂暑假線上程式設計比賽第一題 拆點遊戲
題目詳情 n個節點,m條邊的無向圖,每個節點乙個權值w。定義拆除乙個節點的代價為與其相鄰的節點的權值之和。拆除乙個節點後刪除所有與該節點相連的邊。求拆除所有節點需要花費的最少代價。輸入描述 輸入包含多組測試資料,每組測試資料第一行先輸入n,m 1 n 10000 0 m 20000 第二行輸入n個整...