1. 程式人生 > >算法之DP

算法之DP

三角形 例題 最大 triangle 圖片 ref targe opened -c

一般DP

都是有模板的,先初始化,然後找到不同狀態下數值的關系,使得某個狀態可用另一個狀態由一個固定的方式轉移而來,列出狀態轉移方程,這就是DP;

例題

P1216 [USACO1.5]數字三角形 Number Triangles

技術分享圖片
1 f[i][j]+=max(f[i-1][j-1],f[i-1][j]);
方程

P1044 棧

技術分享圖片
1 f[i]+=f[j]*f[i-j-1];
方程

P2800 又上鎖妖塔

技術分享圖片
1 f[i]=min(f[i-1]+t[i],min(f[i-2]+t[i-1],f[i-3]+t[i-2]));
方程

P1057 傳球遊戲

可以看出,裸的DP是幾乎沒有難度的,當然某些題除外如P1004,P1280等題,值得思考。

背包問題

背包屬於基礎DP,但拓展性是最高的。

具體可以看dd大牛的《背包九講》

1 f[v]=max{f[v],f[v-c[i]]+w[i]}; 

上面的是01背包的轉移方程,但v是從V...c[i]的。

為什麽呢?這個方程代表第v個體積的物體的最大值=max(他自己本身,v-第i個物體的體積時的最大值+第i個物體的值)

例題

01背包基本是套這個模板,但也不缺乏很有思考性的,如P2370,P2979,P1156,P4544(這個要單調隊列優化,但純背包有60-70分,題解在這裏);

線段樹
單調隊列優化

優先隊列優化

狀壓DP(就是變相暴力)

樹形DP(我最不擅長)

二分優化

還有一些提高組的就不列了(如斜率優化,數位,插頭DP)

算法之DP