錯排問題 最長上公升子串行 DP

2021-10-05 15:44:13 字數 1108 閱讀 5635

nowcoder每天要給很多人發郵件。有一天他發現發錯了郵件,把發給a的郵件發給了b,把發給b的郵件發給了a。於是他就思考,要給n個人發郵件,在每個人僅收到1封郵件的情況下,有多少種情況是所有人都收到了錯誤的郵件?

即沒有人收到屬於自己的郵件。

當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用d(n)表示,那麼d(n-1)就表示n-1個編號元素放在n-1個編號位置,各不對應的方法數,其它類推.

第一步,把第n個元素放在乙個位置,比如位置k,一共有n-1種方法;

第二步,放編號為k的元素,這時有兩種情況:

⑴把它放到位置n,那麼,對於剩下的n-1個元素,由於第k個元素放到了位置n,剩下n-2個元素就有d(n-2)種方法;

⑵第k個元素不把它放到位置n,這時,對於這n-1個元素,有d(n-1)種方法;

綜上得到

d(n) = (n-1) [d(n-2) + d(n-1)]

特殊地,d(1) = 0, d(2) = 1.

#include

using

namespace std;

intmain()

;for

(int i =

3; i<=n;

++i)

cout<<}return0;

}

題目描述:

乙個數的序列bi,當b1

輸入描述:

第一行輸入序列的長度n(1<=n<=1000)。第二行給出序列中的n個整數,這些整數的取值範圍都在0到10000。

輸出描述:

輸出最長上公升子串行的長度

#include

#include

using

namespace std;

intmain()

vector<

int>

a(v.

size()

,1);

int max =1;

for(

int i=

0; isize()

;++i)}}

cout<}return0;

}

Dp 最長上公升子串 最長上公升子串行

乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...

最長上公升子串行(DP)

time limit 3000ms memory limit 65536k 有疑問?點這裡 乙個數的序列bi,當b 1 b 2 b s的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a 1,a 2,a n 我們可以得到一些上公升的子串行 a i1,a i2,a ik 這裡1 i 1 i 2 i...

最長上公升子串行(Dp)

lis問題是最經典的動態規劃基礎問題之一。如果要求乙個滿足一定條件的最長上公升子串行,你還能解決嗎?給出乙個長度為n整數序列,請求出它的包含第k個元素的最長上公升子串行。例如 對於長度為6的序列 2,7,3,4,8,5 它的最長上公升子串行為 2,3,4,5 但如果限制一定要包含第2個元素,那滿足此...