k上公升段,對於排列問題的處理

2022-05-31 07:30:18 字數 774 閱讀 9303

問題描述:

對於n的乙個全排列,如果它可以劃分成k個單調遞增序列,每個序列都盡可能最長,則稱其為k上公升段。例如:排列1 2 4 5 6 3 9 10 7 8是乙個合法的3上公升段,它可以劃分成1 2 4 5 6;3 9 10;7 8這三個單調遞增序列。對每個給定的(n,k),請你給出n的所有k上公升段的個數。

輸入格式:

輸入僅有1行,包含兩個數n, k(1 < n < 20, 1 < k < n)。

輸出格式:

輸出n的所有k上公升段的個數。

樣例輸入:

3 2輸出:

4( 說明,符合條件的排列是132,312,213,231)

這道題不用深搜,用dp

對於乙個全排列i,假設劃分成了j段。

那麼如果在每一段的末尾加乙個數,那麼就可以變成i+1個數的劃分成為j段。

還有,如果在每乙個頭,或者非段末加入,那麼就可以變成i+1個全排列劃分成了j+1段

對於每乙個位置,都可以是一種方案書,那麼這就是加法原理和乘法原理

設dp(i,j)表示對於第i個數,劃分成j段的方案數

dp(i,j)=dp(i-1,j)*j+dp(i-1,j-1)*(i-j+1)

碼量很少附上**

#include#include

#define n 20+1

#define ll long long

using

namespace

std;

ll f[n][n];

intmain()

C 樂樂的上公升段

題目描述 輸入n及n個正整數,輸出上公升段的數目。輸入 第一行只有乙個正整數 n 第二行共有n個不超過10000的正整數,數與數之間用乙個空格隔開 輸出 只有一行且只有乙個整數 按輸入的順序計算該序列上公升段的數目 樣例輸入 5534 657 435 556 587 樣例輸出 2資料範圍限制 30 ...

對於段頁式記憶體管理的理解

所以段頁式記憶體管理每讀取一資料,要訪問三次記憶體。第一次是由段表暫存器得到段表始址後訪問段表,由此取出對應段的頁表在記憶體中的位址 第二次是訪問頁表得到所需訪問的實體地址 第三次才能訪問真正需要訪問的物理單元。附 mmu是一種硬體電路,它包含兩個部件,乙個是分段部件,乙個是分頁部件,通過分段機制 ...

hdu3415 最大k子段和,單調佇列

題目大意 給定長度為n的陣列,求出最大的區間和,其中區間長度在 1,k 之間 分析 學動態規劃的時候我們會遇到乙個經典問題 最大子段和,這個題跟最大子段和很類似 不同的是區間的長度有限制,無法用原演算法解決 轉換思路 區間 i,j 的和就是ans sum j sum i 1 j i k 那麼對於每個...