P4438 [HNOI/AHOI2018]道路
贴个链接
我是sb,wtmd是猪
题目意思
题意特别绕。。大概就是给一个二叉树,(我没注意到他是颗二叉树,一直以为农村的出边不止一个。。) 每个节点,只能让跟他的左儿子或者右儿子中的一个标记,每个叶子节点的值是
设一个非叶子节点的两个边为0,1 。也就是对每个节点只能标记0 或 1
x表示这个节点走到跟节点经过的没有标记的0的个数,y是走到根节点经过的没有标记的1的个数。
问所有叶子结点的答案的和最小是多少。
对了,,他题上说树的深度最多是40.。。 这个条件我也没看见。
点数有 4e4 个
题解
这不树形dp吗。
dp[i][j][k] 表示 i 这个点到根的路径上没被标记的0有j个,没有被标记的1有k个。
设左儿子是vv[x][0] 右儿子是vv[x][1]
所以转移方程是 dp[x][j][k] = min(dp[vv[x][0]][j][k] + dp[vv[x][1]][j][k + 1] , dp[vv[x][1]][j][k] + dp[vv[x][0]][j + 1][k]);
也就是标记0边的情况跟标记1边的情况。
最近没长脑子,怎么办,,在线急~~
代码:
#include<algorithm>
#include<iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
#include <map>
#include <stack>
#include <bitset>
#include <set>
#include <unordered_set>
#include <random>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef unsigned long long ull;
typedef unordered_set<int>::iterator sit;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
void tempwj(){
freopen("P26