HDU 4705 (樹形dp 逆向思考)

2021-09-26 06:39:14 字數 748 閱讀 9098

題意:樹上任意三個點不在一條路徑上,統計這樣的三點集合有多少種。

思路:限時訓練,想了很久就是沒想到去計算三個點在一條簡單路上有幾種,用總的-在一條路上的 就是所求的結果。

直接求打的**也沒過。

三個點構成的路方案數 s = c(n,3)=n*(n-1)*(n-2)/6

用s減去三個點在一條路徑上的數目就是答案。

列舉中間點作為第二個點,在它的第k棵子樹上找乙個點作為第乙個點,在剩下的,沒有列舉過的結點裡,找乙個點作為第三個點。數目相乘。

這樣問題就變成了統計結點的子節點問題,簡單的樹形dp。

ac**:

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

ll n;

const int inf=1e5+5;

vectorv[inf];

ll dp[inf];

ll ans;

void dfs(ll x,ll fa)

}int main()

ans=0;

dfs(1,0);

ll sum=n*(n-1)*(n-2)/6-ans;

printf("%lld\n",sum);

for(i=0;i}

return 0;

}

HDU 1520 簡單樹形dp

題意 乙個大學要舉行職工party。為使party中每個人都玩的開心,直接上司和下屬關係的員工不能同時參加。每個人都有各自的歡樂值。問如何邀請使得總歡樂值最大。dp i 1 表示選擇i點 dp i 0 表示不選擇i點 include include include include using nam...

HDU 2196 樹形dp入門

鏈結 傳送門 題意 給你乙個n個節點的棵樹,然後給你和 第i臺電腦與第a臺電腦相連的花費 v 問你最長的線路是多長 求樹上任意節點所能達到的最遠點的距離 樹形dp 開個陣列 分別記錄這個點到子樹最遠節點的最長距離和次長距離和記錄到父節點上的最長距離這樣在樹上dp 1.求子樹最長和次長 dp u 0 ...

題解 hdu2196 樹形DP

題目鏈結 分析 求乙個樹中所有節點能到達的最遠距離f i 要用兩個dfs。首先第乙個dfs求出所有每個節點i在其子樹中的正向最大距離和正向次大距離和dist i 0 和dist i 1 如果i節點在子樹中最大距離經過了2號兒子,那麼次大距離就是不經過2號兒子的最大距離 並且還要標記longest i...