当前位置: 首页 > 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.wxhsa.cn/company.asp?id=2243

相关文章:

  • Java的变量和常量
  • 推荐7本书《MLIR编译器原理与实践》、《ONNX人工智能技术与开发实践》、《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》
  • 202009_风二西_USB鼠标流量
  • virtuoso默认设置
  • CF547D Mike and Fish
  • Tarjan vDCC 缩点
  • ABC_419_F - All Included
  • 软件工程第一次作业-自我介绍
  • DIFY 与 LangChain
  • VMware CentOS 7 `yum` 修复及 VMware Tools 安装问题复盘
  • 接口测试---Requests
  • LangChain大模型应用开发介绍
  • [豪の学习笔记] 软考中级备考 基础复习#8
  • lc1025-除数博弈
  • 漏洞解析--文件包含漏洞究竟怎么用?
  • 办公室装修 暂存
  • 博客更新公告
  • 爆:GitHub Copilot支持包括Anthropic、Azure、Google Gemini、Groq、OpenAI 和 OpenRouter等供应商API
  • JavaWeb05 - 详解
  • CF182C
  • CF185D
  • Python计算文件md5
  • CF201C
  • CF1774D
  • CF23C
  • CF37C
  • CF33D
  • 支持类 Unix 语法 ``:Windows 下用 PowerShell 7 优化 npm 和 VS Code
  • 初赛程序阅读做题要点
  • 模拟堆(手写堆 的五大操作)