筆試刷題-百度2018-06-21

題目描述:


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

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

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

輸入例子1:
5 2

輸出例子1:
66

*/

思路如下:

K個小于好把n給數分成了k+1個降序序列
descSeq1 descSeq2 ... descSeq(k+1)
其中descSeq也可能是單獨一個數而已也教程降序序列
dp[n][k]表示用前1-n個數全排列, 用k個小于號和n-1-k給大于號分割的合法數目
dp[n][k]可以由兩種部分構成 dp[n-1][k] dp[n][k-1]、

dp[n-1][k]要變成dp[n][k]就是在原來的1-n-1的全排列中插入一個n然后使得小于號數目不增加
那么只能放在descSeq1 或 descSeq2...或descSeq(k+1)相應序列的最左邊這樣才不會增加小于號數目
這樣一個原來在dp[n-1][k]中的合法序列插入n后對應了 k+1個新的序列

dp[n][k-1]要變成dp[n][k]就是在1-n-1全排列中插入一個n使得小于號數目增加1
descSeq1 descSeq2...descSeq(k)
可以插入在一個descSeq中見的位置
原來有n-1個數那么n插入的位置有n個位置,但是不能插入在descSeq的最左端的位置這樣不增加小于號
那么一共有k個descSeq那么只能插入的位置n-k

n>k
dp[n][k]=(k+1)dp[n-1][k]+(n-k)dp[n-1][k-1]

n>=2
base case:
dp[n][k]=0(n<=k)

dp[n][0]=1

代碼如下:


#include<stdio.h>
#include<iostream>

#define MAX_N 1005
#define MAX_K 1005
#define MOD 2017

using namespace std;

int dp[MAX_N][MAX_K];

int main(){
    int N, K;
    scanf("%d%d", &N, &K);
    for(int n=0; n<=N; n++)
        dp[n][0]=1;
    for(int n=2; n<=N; n++){
        for(int k=0; k<n; k++){
            dp[n][k]=((k+1)*dp[n-1][k])%MOD+((n-k)*dp[n-1][k-1])%MOD;
            dp[n][k]%=MOD;
        }
    }
    printf("%d", dp[N][K]);
    return 0;
}



?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 動態規劃(Dynamic Programming) 本文包括: 動態規劃定義 狀態轉移方程 動態規劃算法步驟 最長...
    廖少少閱讀 3,338評論 0 18
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,421評論 0 2
  • 初始化git倉庫: git init 自報家門: git config --global user.name "x...
    小破孩_小翟閱讀 514評論 0 0
  • 林夏蛻變三屆第二程念念感恩(0710) 【今日感恩】 感恩朋友為孩子報了夏令營活動,并開車把孩子送到夏令營營地。 ...
    愛相續閱讀 146評論 0 1
  • 我想進簡書,以程序員的身份。 哦,你們問我為什么不直接去簡書面試程序員,廢話,當然是因為我連面試機會都沒有啊。 最...
    我要變得很有錢閱讀 165評論 2 0