p2585[zjoi2006]三色二叉樹
題目傳送門:p2585 [zjoi2006]三色二叉樹 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
題目:
思路分析:
可以借鑑動態規劃:p1352沒有上司的舞會 - 朱朱成 - (cnblogs.com),建立乙個二維的dp 第二維01代表有沒有去,有沒有染成綠色的。對於乙個結點來說,以這個結點為根的子樹,染成綠色的數目,因為是二叉樹,所以乙個結點只會連兩個結點,所以不染成綠色的就等於max(左子節點染成綠色,的左子樹綠色數目總和,右子節點不染成綠色,的右子樹綠色數目總和),因為不染成綠色,左右子節點必有乙個染成綠色,取最優就行,因為是三種顏色,所以不可能父節點不成綠色,兩個子節點也不是綠色,可以根據抽屜原理得知。然後其他的計算其實跟其他兩種顏色沒關係了,就考慮染不染成綠色。然後我們再計算這個點染成綠色,就等於左子節點不染成綠色,的左子樹綠色數目總和+右子節點不染成綠色,的右子樹綠色數目總和+1。注意+1,就是父節點剛染成綠色的1。然後利用dfs,按照這個思路樹形dp即可。因為題目是求最多和最少的,所以構建兩個dp陣列,max改成min即可。
關鍵dp**:
ac完整**:
1 #include 2 #include 3 #include 4 #include5using
namespace
std;
6const
int maxn = 5 * 1e5 + 5;7
//設tree[i][0] 為第i個節點的左節點編號8//
設tree[i][1] 為第i個節點的右節點編號9//
dp[i][0]為第i個節點 為根 並且這個結點塗綠色 的子樹 綠色最多的數量
10//
dp[i][12]為第i個節點 為根 並且這個結點不塗綠色 的子樹 綠色最多的數量
11int dp1[maxn][2];//
乙個求max 乙個求min
12int dp2[maxn][2
];13
int tree[maxn][2
];14
intcnt;
15string
str;
16void dfs(int
root)
1726
else
if (str[root] == '2'
)2733}
3435
void dp_dfs1(int
x)36
41if (str[x] == '
0')//
如果是葉子
4246
else
4755}56
void dp_dfs2(int
x)57
62if (str[x] == '
0')//
如果是葉子
ZJOI2005 午餐 貪心,動態規劃
上午的訓練結束了,thu acm小組集體去吃午餐,他們一行n人來到了著名的十食堂。這裡有兩個打飯的視窗,每個視窗同一時刻只能給乙個人打飯。由於每個人的口味 以及胃口 不同,所以他們要吃的菜各有不同,打飯所要花費的時間是因人而異的。另外每個人吃飯的速度也不盡相同,所以吃飯花費的時間也是可能有所不同的。...
P2051(動態規劃)
這次小可可想解決的難題和中國象棋有關,在乙個n行m列的棋盤上,讓你放若干個炮 可以是0個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思...
問題 P 動態規劃 收益
題目描述 建太空梯進入太空要1兆億?魔法學院的院長瞪大了眼睛。這只是基礎設施的費用,後期還要 墨老師掰著手指算。哎呀,現在地主也很窮啊,學院的錢批下來就這麼多,你想辦法用這筆錢在債券市場上獲得最大收益吧。院長皺著眉頭。簡單來說,就是你有一筆錢,你要將這筆錢去投資債券,現在有d種債券,每種債券都有乙個...