UVA 10859 同時dp兩個變數 樹形dp

2021-06-20 23:44:24 字數 1170 閱讀 5436

同時dp兩個變數 即 —— 在 v1 最小的情況下 v2 最小

可以令dp的內容為 v1*m+v2 使得這個數值最小,m是乙個比 v2最大值還要大的值。

這個題中,v1 為街燈的數量,v2 為被兩個街燈照亮的數量 ,要求是 v1 最小 v2 最大 。 令 v2為 乙個街燈照亮的路的數量,這樣方向就一致了。

一共有兩種決策,放燈還是不放燈,但是這個決策又和父節點有關。所以有必要在狀態中描述父節點的狀態。這樣裝填描述才完整。

dp[i][j] 表示以i為根節點(包括其與父親那條邊)所有邊照亮要多少燈,j 為1 是在其父節點有燈的情況下,0是在無燈的情況下。

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define read freopen("acm.in","r",stdin)

#define write freopen("acm.out","w",stdout)

#define ll long long

#define pii pair#define pdi pair#define pdd pair#define mii map::iterator

#define fst first

#define sec second

#define ms(x,d) memset(x,d,sizeof(x))

#define inf 0x3f3f3f3f

#define all(x) x.begin(),x.end()

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define max 500000

#define root 0,n-1,1

#define pb push_back

#define for(a,b,c) for(int a=b;ag[2000];

int used[2000];

int dp[2000][2];

const int m=2000;

void dfs(int v,int fa)

return ;

}

for(int i=0;i

樹形DP(放置街燈,uva 10859)

前面也做了一道很像的題,那道題只要求放置的數目最少,要求覆蓋的是點。在這題中,要求覆蓋的是邊,不但要求放著的數目最少,更要求覆蓋兩次的邊最多。因此貪心法不再適用,最少要多少個點可以貪心求出,但是同時要求覆蓋兩次的邊要最多卻不是貪心法能夠解決的,無論如何都是逃不過動態規劃的。所以一開始用貪心做,做到最...

如何同時管理兩個專案?

最近比較忙。產品的乙個版本a正在測試部門進行功能 效能的驗證測試,另乙個版本b正在處於需求分析階段。因工作安排關係,我作為版本a專案組c和版本b專案組d的專案經理,需要負責版本a的問題定位 小特性開發的的組織工作,需要負責版本b的專案計畫 開發組織工作。多項工作進行,面臨多個領導的壓力,確實是很有挑...

如何同時返回兩個值

關鍵字就是被c語言本身占用的那些字串,比如 int,typedef。我們在定義變數或函式的名字時時要避開它們。標誌符就是我們定義的變數和函式的名字。提出乙個問題 寫乙個函式,計算兩個數相除,要求同時返回商和餘數,怎麼寫?我們知道函式的返回值只能有乙個,同時返回兩個數這跟本不可能。但用結構就變為可能了...