一道比較神的樹形dp,恕我太菜,一開始想的是三維的。。
實際上並不需要三維,只需要用0,1,2表示即可
d p[
u][0
]dp[u][0]
dp[u][
0]表示當前點不放,他的某乙個兒子覆蓋他的代價
d p[
u][1
]dp[u][1]
dp[u][
1]表示當前點放,他的子樹也被覆蓋的代價
d p[
u][2
]dp[u][2]
dp[u][
2]表示覆蓋當前點的子樹除當前點之外的代價
思考一下為什麼會有dp[
u][2
]dp[u][2]
dp[u][
2],因為乙個點不選,他的兒子也可以不選
只要他的兒子的子樹全部合格就行…
**
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int inf =
2147483647
;const
int maxn =
10007
;int dp[maxn][3
];int n;
struct nodeedge[maxn*2]
;int cnt,head[maxn]
;void
add(
int from,
int to)
void
dfs(
int u,
int fa)
if(flag==
0)dp[u][0
]+=delta;
if(son==
1&&edge[head[u]
].to==fa)
}int
main()
dfs(1,
0); cout<<
min(dp[1]
[1],dp[1]
[0])
;return0;
}
Usaco2008 Jan 電話網路
第2.n行 每行為2個用空格隔開的整數a b,為兩塊相鄰草地的編號 5 1 35 2 4 33 5 輸入說明 farmer john的農場中有5塊草地 草地1和草地3相鄰,草地5和草地2 草地 4和草地3,草地3和草地5也是如此。更形象一些,草地間的位置關係大體如下 或是其他類似的形狀 輸出2 輸出...
1596 Usaco2008 Jan 電話網路
farmer john決定為他的所有奶牛都配備手機,以此鼓勵她們互相交流。不過,為此fj必須在奶牛們居住的n 1 n 10,000 塊草地中選一些建上無線電通訊塔,來保證任意兩塊草地間都存在手機訊號。所有的n塊草地按1.n 順次編號。所有草地中只有n 1對是相鄰的,不過對任意兩塊草地a和b 1 a ...
1596 Usaco2008 Jan 電話網路
farmer john決定為他的所有奶牛都配備手機,以此鼓勵她們互相交流。不過,為此fj必須在奶牛們居住的n 1 n 10,000 塊草地中選一些建上無線電通訊塔,來保證任意兩塊草地間都存在手機訊號。所有的n塊草地按1.n 順次編號。所有草地中只有n 1對是相鄰的,不過對任意兩塊草地a和b 1 a ...