当前位置: 首页 > news >正文

DP 杂题

题目

[ARC157E] XXYX Binary Tree

一个很显然的暴力,\(f_{u,a,b,c}\) 表示在在 \(u\) 的子树中,是否有 \(a\)XX\(b\)XY\(c\)YX

这个状态 \(O(n^4)\) 的,考虑优化,可以先省去一个 \(c\),变成 \(f_{u,a,b}\),因为 \(a+b+c\) 的总和是知道的。

然后优化不了了……

只能重新设计,发现都没有用上二叉树的条件,显然要找一点性质的。

可以发现 \(Y\) 的个数好像可以确定,如果 \(Y\) 为非根节点,那么 \(Y\) 的数量有 \(B\) 个,否则就有 \(B+1\) 个,因为一个除了根节点的 \(Y\) 肯定可以贡献一个 XY

还可以发现非叶子的 \(Y\) 可以贡献两个 YX

然后就可以刻画 XYYX 的数量了,这里分根节点是否为 \(Y\) 两种情况。

如果根不为 \(Y\),那么一共有 \(B\)\(Y\),记叶子节点为 \(Y\) 的个数为 \(sum\),那么 YX 的数量就是 \(2(B-sum)\),所以 \(sum\) 满足 \(sum=B-\frac{C}{2}\)

如果根为 \(Y\),那么一共有 \(B+1\)\(Y\),记叶子节点为 \(Y\) 的个数为 \(sum\),那么 YX 的数量就是 \(2(B+1-sum)\),所以 \(sum\) 满足 \(sum=B+1-\frac{C}{2}\)

所以设 \(f_{u,i,0/1}\) 表示 \(u\) 的子树中有 \(i\) 个叶子为 \(Y\)\(u\) 是否是 \(Y\) 时最多有多少个非叶子的 \(Y\)

这里可以 \(O(n^2)\) 树上背包转移。

代码
#include <bits/stdc++.h>void Freopen() {freopen("", "r", stdin);freopen("", "w", stdout);
}using namespace std;
const int N = 1e4 + 10, M = 2e5 + 10, inf = 1e9, mod = 998244353;int n, A, B, C;
int f[N][N][2], siz[N];vector< int> G[N];void dfs( int u) {siz[u] = 0;if (! G[u].size()) {siz[u] = 1;f[u][0][0] = 0, f[u][1][1] = 0;return ;}f[u][0][0] = 0, f[u][0][1] = 1;for ( auto v : G[u]) {dfs(v);// 这里注意,必须要倒叙枚举,这样才能保证不会用到已经被转移过的信息for ( int i = siz[u]; i >= 0; i --)for ( int j = siz[v]; j >= 0; j --) {f[u][i + j][0] = max(f[u][i + j][0], f[u][i][0] + max(f[v][j][0], f[v][j][1]));f[u][i + j][1] = max(f[u][i + j][1], f[u][i][1] + f[v][j][0]);}siz[u] += siz[v];}
}void solve() {cin >> n >> A >> B >> C;for ( int i = 1; i <= n; i ++) {G[i].clear();for ( int j = 0; j <= B + 1; j ++)f[i][j][0] = f[i][j][1] = -inf;}for ( int i = 2, fa; i <= n; i ++)cin >> fa, G[fa].push_back(i);if (C & 1) return cout << "No\n", void();dfs(1);if (B - C / 2 >= 0 && f[1][B - C / 2][0] >= C / 2) {cout << "Yes\n";return ;}if (B + 1 - C / 2 >= 0 && f[1][B + 1 - C / 2][1] >= C / 2) {cout << "Yes\n";return ;}cout << "No\n";
}signed main() {ios :: sync_with_stdio(false);cin.tie(0), cout.tie(0);int t; cin >> t;while (t --) solve();return 0;
}
http://www.sczhlp.com/news/94622/

相关文章:

  • Java的变量和常量
  • 202009_风二西_USB鼠标流量
  • 公司注册网站及流程厦门景观绿环建设行业协会网站
  • 注册网站刀具与钢材范围网页翻译功能
  • 做手机网站的好处网络工程二本最好的出路
  • 做网站有自己的服务器网站网格布局
  • pt网站怎么下载与做邵武建设局网站
  • 环保部网站建设项目修改wordpress后台图标
  • 帝国cms企业网站佛山做网站开发
  • 山东网站开发工作室绵阳网站建设制作
  • 网站开发凭证做什么科目清远市网站建设公司
  • virtuoso默认设置
  • CF547D Mike and Fish
  • Tarjan vDCC 缩点
  • 网站的配置标题合肥企业网站模板建站
  • 网站春节放假中山网站建设半江红
  • 网站开发代码h5章丘区网站建设
  • 跳转网站正在建设中驻马店广告制作公司
  • 网站服务器空间价格三亚市住房与城乡建设局网站
  • 在线制作书封网站深圳做二维码网站设计
  • 无锡网站营销公司哪家好自己如何建设企业网站
  • 正规的网站建设明细报价表软件开发的工作
  • 网站收录入口申请查询大背景类型的网站设计
  • 网站 pr上海免费注册公司官网
  • 做网站茶叶首页标题怎么写企业网站策划建设方案百度
  • 做网站给文件不侵权青海微网站建设
  • ABC_419_F - All Included
  • DIFY 与 LangChain
  • VMware CentOS 7 `yum` 修复及 VMware Tools 安装问题复盘
  • 接口测试---Requests