《演算法競賽高階指南》0x51線性DP 照相館排列

2022-05-20 10:19:59 字數 934 閱讀 9773

題目要求將n個人排成不超過五列,每列的人數限制而且遞減,現在要求每行每列都是遞減的方案的數量,通過狀態集合以及轉移規律,f[a][b][c][d][e]滿足索引遞減的性質 ,在轉移的時候要維護這個性質,所以除了e以為的所有的索引-1情況都需要考慮,e-1的情況自然維護了這個性質。此外,從高到低排這些人,當前要排的人排在哪一行就是決策的劃分過程,當前決策中的方案數量等價於之前階段的某乙個決策的方案數,所以直接累加轉移的方案即可。

在dp問題中,集合和集合劃分的概念十分重要,本問題中的集合上的屬性是數量。

**:

#include#include

#include

using

namespace

std;

const

int maxn = 31

;typedef

long

long

ll;ll f[maxn][maxn][maxn][maxn][maxn];

intn;

intmain();

for(int i=0;i>s[i];

memset(f,

0,sizeof

(f));

f[0][0][0][0][0]=1

;

for(int a=0;a<=s[0];a++)//

保證後一排填的人比前面的小

for(int b=0;b<=min(s[1],a);b++)

for(int c=0;c<=min(s[2],b);c++)

for(int d=0;d<=min(c,s[3]);d++)

for(int e=0;e<=min(s[4],d);e++)

printf(

"%lld\n

",f[s[0]][s[1]][s[2]][s[3]][s[4

]]);

}}

《演算法競賽高階指南》0x51線性DP I 區域

題目給出乙個n m的矩陣,要求從中找出乙個凸連通塊,使得該連通塊包含k個格仔並且格仔數之和最大,凸連通塊由若干行構成,左右最多各有乙個峰值。可通過dp解決,每行處理完代表乙個階段,f i,j,l,r,x,y 表示當前處理第i行,一共選擇了j個格仔,第i行選擇的格仔是 l,r 左右的狀態是x,y表示下...

《演算法競賽高階指南》0x51線性DP 傳紙條

題目要求 給乙個n m的矩陣,求從左上角到右下角的兩條路徑,使得兩條路徑上的值只和最大。從左上角往右下角走的時候只能向下或者向右。在這個問題中階段就是步數,步數與座標點的橫縱座標之和相差乙個常數,所以可以通過座標只和以及兩個點的橫座標來確定當前的狀態集合。此時通過乙個點的所有入邊更新乙個點即可。一共...

演算法競賽高階指南 0x00

快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...