一道樹形dp啦~~~
其實我是做過這道題的加強版後才做的這道題……不過先由淺入深,先發這個~
首先,我定義 f [ u ] [ i ] 為在第 u 個點上,給它時間為 i 是能獲取的最大價值。
有乙個需要注意,如果說這是乙個展廳,設給這個點的時間為 t ,那麼實際能偷畫的時間只有 t - 雙倍邊權。
這也導致了如果這個點是乙個分支,那麼我給兩邊的時間和(就是我給這個點的時間)必定要大於等於二倍邊權。
這樣就避免了在dfs裡傳入無關的冗雜的變數,使得狀態統一比較容易維護。
接下來貼**:
#include#include#include
#include
using
namespace
std;
#define maxn 2000
int f[2000][2000],n,am=1
;void dfs(int
x)
int l=++am;
dfs(l);
int r=++am;
dfs(r);
for(int i=t;i<=n;i++)
for(int j=0;j<=i-t;j++)
f[x][i]=max(f[x][i],f[l][j]+f[r][i-t-j]);
}int
main()
P1270 「訪問」美術館
p1270 訪問 美術館 一開始以為只是一棵普通樹,後來才發現題目中寫了每個走廊要麼分叉為兩條走廊,要麼通向乙個展覽室,是一棵二叉樹,可以直接用陣列表示。輸入是按照dfs序給出的,可以直接按照類似於線段樹bulid來建立這棵二叉樹,其中藏畫數不為0的是葉子結點,是遞迴建樹的終點。小偷是要偷畫,最後還...
P1270 「訪問」美術館
題意 給出一顆樹形圖,每一條邊都有一定權值,葉子節點裡面有若干副畫 現在有乙個小偷要進去偷畫,每一條邊的權值就是走的時間,偷畫需要5秒 給出警察到來時間,問最多能偷多少副畫 思路 這是一道樹形dp 我們遍歷每個節點,從根節點dfs到葉子節點,那麼如何進行狀態轉移呢 我們用乙個dp i j 表示在i節...
洛谷P1270 訪問美術館
題目 樹形dp,首先考慮遞迴建圖,類似於線段樹的中序遍歷。然後取狀態dp i j 表示i點花費j時間所偷到的最多的畫,有方程 dp now nwt max dp now nwt dp lso i dp rso nwt i data now t 注意三點 可能一次偷不完所有的畫 來回要路徑花費時間乘二...