顯然是樹形dp,可以在狀態轉移的過程中順便把樹給建出來,定義 f[
i][j
] f[i
][j]
為當節點
i i
被染成顏色
j' role="presentation" style="position: relative;">j
j時,以
i i
為根的子樹中最多有多少個節點被染成綠色,g[
i][j
]' role="presentation" style="position: relative;">g[i
][j]
g[i]
[j]定義為對應的最小值,設計對應的狀態轉移方程即可。
兩者可以按照建樹的順序一起轉移,以提高時間效率,優化後的時間複雜度為 o(
n)o (n
)。
#include
#include
const
int maxn=500005;
char s[maxn];int now,mx[maxn][3],mn[maxn][3];
void dp(int x)
else
if(s[x]=='1')
else
if(s[x]=='2')
}int main()
ZJOI2006 三色二叉樹 (樹形dp)
輸入格式 輸入檔名 tro.in 輸入檔案僅有一行,不超過500000個字元,表示乙個二叉樹序列。輸出格式 輸出檔名 tro.out 輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。輸入輸出樣例 輸入 1 1122002010輸出 1 5 2 有人做不出好像是因為沒讀懂題...
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 ...
BZOJ1864 Zjoi2006 三色二叉樹
標籤 樹形dp description input 僅有一行,不超過500000個字元,表示乙個二叉樹序列。output 輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。sample input 1122002010 sample output 5 2題意 給定一棵二叉樹...