度度熊最近對全排列特別感興趣,對於1到n的乙個排列,度度熊發現可以在中間根據大小關係插入合適的大於和小於符號(即 『>』 和 『<』 )使其成為乙個合法的不等式數列。但是現在度度熊手中只有k個小於符號即(『<」)和n-k-1個大於符號(即』>』),度度熊想知道對於1至n任意的排列中有多少個排列可以使用這些符號使其為合法的不等式數列。
輸入描述:
輸入包括一行,包含兩個整數n和k(k < n ≤ 1000)
輸出描述:
輸出滿足條件的排列數,答案對2017取模。
示例1輸入
5 2輸出
思路: dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1)) % 2017;
dp[i][j]表示有i個數字及j個小於號所能組成的數量(大於號數量當然是i - j - 1次,後面需要使用)
而加入第i + 1個數字時,分以下四種情況:
1.如果將i+1插入當前序列的開頭,即有了1<2,加入後成為3>1<2,會發現等於同時加入了乙個大於號!(此時可以無視1與2之間的關係,因為i+1>i)
2.如果將i+1插入當前序列末尾,即1<2變成了 1<2<3,會發現等於同時加入了乙個小於號! (此時可以無視1與2之間的關係,因為i+1>i)
3.如果將i+1加入乙個小於號之間,即已經有 1<2了,向中間加入3,會發現變成了1<3>2,等於同時加入了乙個大於號!
4.如果將i+1加入乙個大於號中間,即有了2>1,變成了2<3>1,等於同時加入了乙個小於號!
綜上所述,dp[i][j]等於以上四種情況之和:
dp[i - 1][j] //將i加在開頭等於加入乙個大於號,即要求i-1個數時已經有了j個小於號
dp[i - 1][j - 1] //將i加在末尾等於加入乙個小於號,即要求i-1個數時已經有了j-1個小於號
dp[i - 1][j] * j //將i加在任意乙個小於號之間,等於加入了乙個大於號;即要求i-1個數時已經有了j個小於號,每個小於 號都可以進行這樣的一次插入
dp[i - 1][j - 1] * (i- j - 1) //將i載入任意乙個大於號之間,等於加入了乙個小於號;即要求i-1個數時有了j-1個小於號,而此時共有
(i - 1) - (j - 1)- 1個大於號,每個大於號都要進行一次這樣的操作
合併同類項即為
dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1))
最後要記得取模
#include
#include
using
namespace
std;
int main()
for(int i=3;i<=n;i++)
} cout
0; }
百度2017春招筆試真題
好久不寫題,dp 都這麼生疏了,想不到複雜度合適的dp 度度熊想去商場買一頂帽子,商場裡有n頂帽子,有些帽子的 可能相同。度度熊想買一頂 第三便宜的帽子,問第三便宜的帽子 是多少?直接將所有 存入se t 中,然後輸出第三小的即可。剛開始沒注意不能相等,直接排序輸出,結果沒ac 仔細看樣例後就能理解...
百度2017春招筆試真題程式設計題集合
程式設計題 買帽子 時間限制 1秒 空間限制 32768k 度度熊想去商場買一頂帽子,商場裡有n頂帽子,有些帽子的 可能相同。度度熊想買一頂 第三便宜的帽子,問第三便宜的帽子 是多少?輸入描述 首先輸入乙個正整數n n 50 接下來輸入n個數表示每頂帽子的 均是正整數,且小於等於1000 輸出描述 ...
百度2017春招筆試真題程式設計題集合 2
題目 乙個數軸上共有n個點,第乙個點的座標是度度熊現在位置,第n 1個點是度度熊的家。現在他需要依次的從0號座標走到n 1號座標。但是除了0號座標和n 1號座標,他可以在其餘的n 2個座標中選出乙個點,並直接將這個點忽略掉,問度度熊回家至少走多少距離?以下是原始碼 include include i...