這一題不是自己想出來的思路,看了一眼解題報告。
題意是這樣的,求給定的一棵樹中是否存在一條長度為l的路徑,注意這個值可能為負數,這也是簡潔版的解題報告的最後一句忠告。這題有乙個非常好的特性,那就是所有的邊的長度要麼為1,要麼為2,也就是說我們所求得的路徑是由若干個1,2組成的。那麼也就有了下面的結論:當我們得到一條長度為s的路徑時,現在考慮到構成路徑s的左右兩端的兩條邊,這兩條邊的組合情況是(1, 1), (1, 2), (2, 2)那麼注意到我們始終可以去掉長度為2的一段,因此有結論:若整個樹中最長的偶數邊為em,最長的奇數邊為om,由於任何乙個詢問不是奇數就是偶數,那麼如果這個數是偶數的話,則判定其是否小於我們計算出來的em,同理,奇數的話,則判定是否小於om即可。
求解的過程就是從任意乙個點開始進行dfs,並且對於每一條邊保留兩個值,表示從這個頂點的這一條邊向下能夠得到的偶數和奇數路徑的最大長度,再結合其孩子的情況加之邊的奇偶進行動態規劃。
**如下:
#include #include#include
#include
#include
using
namespace
std;
struct
node e[200010
];int head[100005
], n, q, idx, om, em;
bool vis[200010
];void insert(int a, int b, int
c) void update(int
x) vis[i] = 1
; update(e[i].x);
int om = 0, em = 0
;
for (int j = head[e[i].x]; j != -1; j =e[j].next)
if (e[i].fee == 1)
e[i].path[
1] = em + 1
; }
else
}em = max(em, e[i].path[0
]); om = max(om, e[i].path[1
]); }
}int
main()
update(1);
intx;
for (int i = 0; i < q; ++i)
if (x & 1
) else}}
return
0;
}
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...