樹形DP JZOJ 5788 餐館

2022-04-30 20:18:13 字數 1735 閱讀 6147

description

k妹的胡椒粉大賣,這辣味讓食客們感到刺激,許多餐館也買這位k妹的賬。有n家餐館,有n-1條道路,這n家餐館能相互到達。k妹從1號餐館開始。每乙個單位時間,k妹可以在所在餐館賣完盡量多的胡椒粉,或者移動到有道路直接相連的隔壁餐館。第i家餐館最多需要a[i]瓶胡椒粉。k妹有m個單位的時間,問她最多能賣多少胡椒粉。

input

第一行有兩個正整數n,m。

第二行描述餐館對胡椒粉的最大需求量,有n個正整數,表示a[i]。

接下來有n-1行描述道路的情況,每行兩個正整數u,v,描述這條道路連線的兩個餐館。

output

乙個整數,表示她最多能賣的胡椒粉瓶數。

sample input

樣例1輸入

3 59 2 5

1 21 3

樣例2輸入

4 51 1 1 2

1 22 3

3 4樣例3輸入

5 10

1 3 5 2 4

5 23 1

2 34 2

sample output

樣例1輸出

14樣例2輸出

3樣例3輸出

15

data constraint

對於10%的資料,n≤20。

對於50%的資料,n≤110。

對於100%的資料1 ≤ n, m ≤ 500,1 ≤ a[i]≤ 10^6,

第5到第10個測試點都有多個子測試。

hint

在樣例1的中,辣妹到達城市2後就恰好沒時間賣辣椒粉了。

分析這題比賽時並沒有想做,因為折返的騷操作讓我想不到怎麼搞方程(其實一開始列的方程還是挺像正解的233)

設f[i][j][0/1]表示以i為根的子樹用了j的單位時間有/無到達根的最大收益,方程顯然:

f[u][j][1]+f[v][k][0]→f[u][j+k+1][1]

f[u][j][0]+f[v][k][1]→f[u][j+k+2][1]

f[u][j][0]+f[v][k][0]→f[u][j+k+2][0]

然後這樣是o(n2)可以證明,這裡不做過多敘述

#include #include 

using

namespace

std;

const

int n=501

;struct

edge g[

2*n];

intcnt,list[n];

int f[n][n][2

];int

a[n],d[n];

intn,m;

void add(int u,int

v) void

init()

}void dfs(int u,int

fa)

for (int j=m;j>=0;j--)

for (int k=0;k<=m;k++)

for (int j=m;j>=0;j--)

for (int k=0;k<=m;k++)

}for (int i=m;i>=1;i--)

f[u][i][

0]=max(f[u][i][0],f[u][i-1][0]+a[u]),

f[u][i][

1]=max(f[u][i][1],f[u][i-1][1]+a[u]);

}int

main()

view code

樹形DP 樹形DP四例

是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...

樹形操作1 樹形拖拽選擇

樹形運算元據,做個整理總結。本篇是關於樹節點拖拽選擇,重新生成一棵新樹,並支援刪除節點。demo 是基於 jquery 及 easy ui 庫實現的。截圖 利用 css3 實現。主要運用了 before,after選擇器 畫 了兩個圓,然後利用border進行圓的調整,最後利用animation及t...

mysql 樹形彙總 mysql 遞迴查詢樹形目錄

早些時候看到一篇 一句sql實現mysql的遞迴查詢 但是必須是在 id大於pid 的情況下才能使用。建立 create table treenodes id int 節點id nodename varchar 60 節點名稱 pid int 節點父id 插入測試資料 insert into tre...