2020.5.21
萌新自從上次區域賽那題碰壁,就勵志學好樹形dp,先從簡單題練練手。
樹形結構,前向星自不用說,觀察給出的資料,在每一層的子問題是剪枝和不剪枝,那肯定是如果對答案貢獻大於零就不剪,小於0就剪掉,所以有如下公式
dp[u]
= dp[v]
>
0? dp[v]
:0
回到問題上,我們的子樹可能不止乙個,那就加等,最後的答案就是每一層的最優解。
最近好好練練dp,因為還是太重要了。
最近訓練有所收穫,能夠處理一些dp問題了,昨天群裡的面試題只花了一分鐘就能看出轉移公式了,再接再厲吧。
**:
#include
using
namespace std;
#define limit (100000 + 5)
//防止溢位
#define inf 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)
//一步兩步
#define eps 1e-6
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%lld\n",a );
#define pi(a,b) pair
#define rep(i, a, b) for(int i = a; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define mod 998244353
#define fopen freopen("c:\\users\\administrator01\\clionprojects\\untitled24\\data.txt", "rt", stdin)
typedef
long
long ll;
typedef
unsigned
long
long ull;
ll read()
while
(s >=
'0'&& s <=
'9')
return x * sign;
}//快讀
void
write
(ll x)
int n , m;
int dp[limit]
;struct nodeedge[limit<<1]
;int head[limit<<1]
,cnt;
void
init()
void
add(
int u,
int v)
int f[limit]
;int ans;
void
dfs(
int u,
int pre)
} ans =
max(ans, dp[u]);
}int
main()
dfs(1,
0);write
(ans)
;return0;
}
洛谷P1122 最大子樹和
提交該題 討論 題解記錄 小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有n 朵花,共有n 1條枝幹將花兒連...
P1122 最大子樹和 (樹形DP)
第一次寫樹形dp,找了乙個簡單的題,先熟悉一下套路,雖然自己的這種寫法,過了,可以求到最大的子樹和,但是不能求到每個結點的最大子樹和,只有某一部分的最大子樹和的根,它是正確的,其他結點都是打工仔。遞迴下去,以子樹推當前結點和子樹的最優值,是可以辦到的 情況1 如果當前子樹 0,就不更新 情況2 如果...
P1122 最大子樹和
小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有nn朵花,共有n 1n 1條枝幹將花兒連在一起,並且未修剪時...