洛谷P1270 “访问”美术馆(树上背包)

题目链接

https://www.luogu.com.cn/problem/P1270

思路

我们定义 d p i j dpij dpij表示当前节点为 i i i,且背包容量为 j j j秒时所能偷走的画的最大值。

在进行状态转移的时候,如果当前节点是叶子节点,就判断能取多少。如果是分叉路口,就枚举分别分配给左右子树的时间来进行转移。

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int>pii;
const int N = 6e3 + 5, M = 1e6 + 5;
const int mod = 998244353;
int n, cnt;
int dp[N][N];//当前节点为i用掉j秒能偷到的画的数量的最大值
void dfs()
{
	int root = ++cnt, time, num;
	cin >> time >> num;
	time <<= 1;
	if (num)
	{
		for (int i = time; i <= n; i++)
		{
			dp[root][i] = min(num, (i - time) / 5);
		}
	}
	else
	{
		int left = cnt + 1;
		dfs();
		int right = cnt + 1;
		dfs();
		for (int i = time; i <= n; i++)
		{
			for (int lr = 0; lr <= i - time; lr++)
			{
				dp[root][i] = max(dp[root][i], dp[left][lr] + dp[right][i - time - lr]);
			}
		}
	}
}
void solve()
{
	cin >> n;
	n--;
	dfs();
	cout << dp[1][n] << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int test = 1;
	// cin >> test;
	for (int i = 1; i <= test; i++)
	{
		solve();
	}
	return 0;
}
相关推荐
Phil3234 小时前
多智能体不是越多越好:Google《Towards a Science of Scaling Agent Systems》论文深度解读
算法
6Hzlia4 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
huang5791474 小时前
基于滑动窗口的流式数据算法优化思路3
算法
Ulyanov4 小时前
AudioVision Pro:基于 PySide6 + sounddevice 的实时音频可视化播放器设计
python·算法·音视频
夜不会漫长4 小时前
C++:类和对象(2)
java·javascript·c++
土司大王5 小时前
LeetCode hot100——74.搜索二维矩阵:Java 二分模板
java·算法·leetcode
无小道5 小时前
C++ 中 `explicit` 关键字详解:彻底理解隐式类型转换
c++·explicit
蒸蒸yyyyzwd5 小时前
cpp 选手秋招学习笔记 day34
c++·八股
tyler_download5 小时前
揉扁搓圆transformer架构:NAG优化器算法详解
深度学习·算法·transformer
Tairitsu_H5 小时前
[C++] C++11类和STL的新特性
开发语言·c++·stl·c++11