動態規劃(三)

2021-10-19 17:48:31 字數 2557 閱讀 3045

一、dag上的dp

當題目給定了一張有向無環圖(dag),或原問題可以抽象成乙個dag時,可以在dag上進行dp來求解問題

dag最短路

給定乙個城市的地圖,所有的道路都是單行道,而且不會構成環。每條道路都有過路費,問您從s點到t點花費的最少費用。

f(x)表示從s出發到達x的最少費用

f(x)=min(f(y)+w(y, x))

實現時如何確定轉移順序?

拓撲排序/記憶化搜尋均可

【例題】旅行計畫

(洛谷 p1137)

#include

#include

#include

#include

using

namespace std;

const

int n=

200005

;queue<

int> q;

int n,m;

int tot,head[n]

,in[n]

,dis[n]

;struct nodeedge[n]

;void

add(

int u,

int v)

void

toposort()

}}intmain()

toposort()

;for

(int i=

1;i<=n;i++

)printf

("%d\n"

,dis[i]+1

);return0;

}

【例題】巴比倫塔

(uva437)

若磚塊j可以放在磚塊i之上,那麼在i和j之間連一條邊,權值為磚塊j的高度。

連邊的含義決定了該圖不存在環,是乙個dag。

由於每種磚有三種不同的擺放方式,且每種磚有無限個,可以將其拆成三個結點,看做三塊不同的磚。

設乙個初始結點表示大地,和所有點連邊。原問題轉化為dag上的最長路問題,dp解決。

二、概率與期望dp

通過dp來解決概率與期望的問題。

期望可以理解為平均。

eg:盒子裡有5個紅球,3個白球,摸紅球得兩分,摸白球得一分。

摸到紅球的概率=5/8。摸到白球的概率=3/8。

期望得分=(5/8)*2+(3/8)*1=13/8

【例題】bag of mice(概率dp)

(cf148d

設f[i][j]為輪到公主時袋子裡有i只白鼠,j只黑鼠,公主贏的概率

邊界:f[0][j]=0,因為沒有白鼠算龍贏,f[i][0]=1,因為抓乙隻就是白鼠,公主贏,考慮轉移

公主抓到乙隻白鼠,公主贏,概率為i/(i+j)

公主抓到乙隻黑鼠,龍抓到乙隻白鼠,龍贏,概率為j/(i+j)*i/(i+j-1)

公主抓到乙隻黑鼠,龍抓到乙隻黑鼠,跑出來乙隻黑鼠,轉移到f[i][j-3],概率為j/(i+j)(j-1)/(i+j-1)(j-2)/(i+j-2)

公主抓到乙隻黑鼠,龍抓到乙隻黑鼠,跑出來乙隻白鼠,轉移到f[i-1][j-2],概率為j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)

#include

#include

#include

using

namespace std;

int w,b;

double f[

1005][

1005];

doubledp(

int x,

int y)

intmain()

【例題】red is good(期望dp)

有n張紅牌和m張黑牌,打亂順序放在桌子上,摸到一張紅牌得1元,摸到一張黑牌損失1元,可以隨時停止摸牌,求得到錢數的最大期望。

n<=5000,m<=5000

因為是最大期望,所以有一定的策略。

考慮用f[i][j]表示有i張紅牌j張黑牌的最大期望。

那麼f[i][0]=i,即所有紅牌都摸。

f[0][i]=0,即一張黑牌都不摸。

f[i][j]=max(0,i/(i+j) * (f[i-1][j]+1)+j/(i+j) * (f[i][j-1]-1))

5000*5000的陣列存不下,我們可以將某一維滾動一下。

#include

#include

#include

#define ans1 ((f[j-1][end]+1)*j/i)

#define ans2 ((f[j][end]-1)*(i-j)/i)

using

namespace std;

int n,m,k=

0,end=1;

double f[

100005][

2];int

main()

}printf

("%.6lf\n"

,floor

(f[n]

[end]

*1000000)/

1000000);

return0;

}

動態規劃(三)

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例1 輸入 1,...

動態規劃的思考(三)

from sicp 第一章 1.2.2 樹形遞迴中,有這麼一問題 給了半美元,四分之一美元,10美分,5美分和1美分的硬幣,將1美元換成零錢,一共有多少種不同方式?更一般的問題是,給定了任意數量的現金,我們能寫乙個程式,計算出所有換零錢方式的種數嗎?動態規劃 dynamic programming,...

三道動態規劃題

三道簡單的動態規劃題 有 m x n 個格仔,機械人在最左上角的格仔,星星在最右下角的格仔。機械人只能向左和向下走。問 機械人拿到星星,總共有多少種拿法?如下圖 思路 問題其實就是從左上角走到右下角,有多少種走法。如果倒過來看,站在右下角的角度,走到右下角,只有2種可能 一是從右下角格仔的左邊走來 ...