問題描述:
對於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 那麼對於每個...