標籤:樹形dp
description
input
僅有一行,不超過500000個字元,表示乙個二叉樹序列。
output
輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。
sample input
1122002010
sample output
5 2題意:給定一棵二叉樹,將其染色(紅,綠,藍),其父親節點必須和兩個兒子節點染上不同的顏色,兩個兒子節點也必須染不同顏色,問最多最少有多少個節點被染成綠色
分析:f[i][0]表示當前節點沒染綠色的最大值 f[i][1]表示當前節點染上綠色的最大值
f[i][0]=max(f[l[x]][1]+f[r[x]][0] ,f[l[x]][0]+f[r[x]][1]);
f[i][1]=f[l[x]][0]+f[r[x]][0]+1
最小值同理
code
#include#include#include#include#include#include#include#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=head[x];i;i=e[i].next)
using namespace std;
const int maxn=3e5+6;
ll f[maxn][3],l[maxn],r[maxn],ans1,ans2,cnt=1;
inline void read(int x)
}void dp1(int x)
void dp2(int x)
int main()
bzoj1864 Zjoi2006 三色二叉樹
傳送門 大力建出樹後大力dp 設f i j 表示以i為根節點,根節點顏色為j是的最優解。每次列舉當前結點節點顏色和兒子顏色,時間複雜度o n 27 uses math var a,b array 0.500005,1.3 of longint c array 0.500005 of longint ...
bzoj 1864 Zjoi2006 三色二叉樹
description input 僅有一行,不超過500000個字元,表示乙個二叉樹序列。output 輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。sample input 1122002010 sample output 5 2 hint source day1 ...
BZOJ1864 Zjoi2006 三色二叉樹
僅有一行,不超過500000個字元,表示乙個二叉樹序列。輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。1122002010 5 2仔細考慮我們發現,乙個節點的顏色只有是綠色和不是綠色兩種。如果乙個點x不是綠色,那麼根據抽屜原理,它的兩個兒子一定是乙個綠色,乙個不是綠色。...