題目要求將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 實現的過程類似於倒過來的分治 當然也可以直...