[luogu P3360] 偷天换日 解题报告(树形DP)
2024-08-31 15:42:29
题目链接:https://www.luogu.org/problemnew/show/P3360
题解:
首先我们把边上的消耗放到向下的点上,如果是叶子节点的话就先做一次0/1背包
发现这是一颗二叉树,转移的时候枚举给左儿子多少时间,右儿子多少时间就好
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll; using std::max;
const int N=+;
ll n,tot=;
ll dp[N][N],w[N],c[N];
inline ll read()
{
char ch=getchar();
ll s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void dfs(int now)
{
ll t=read(),x=read();
t<<=;
if (x)
{
for (ll i=;i<=x;i++) w[i]=read(),c[i]=read();
for (ll i=;i<=x;i++)
{
for (ll j=n;j>=c[i];j--) if (j-c[i]>=t) dp[now][j]=max(dp[now][j],dp[now][j-c[i]]+w[i]);
}
return;
}
ll l=++tot;dfs(tot);
ll r=++tot;dfs(tot);
for (ll i=t;i<=n;i++)
for (ll j=;j<=i-t;j++)
{
dp[now][i]=max(dp[now][i],dp[l][j]+dp[r][i-t-j]);
}
}
int main()
{
n=read();n--;
dfs();
printf("%lld\n",dp[][n]);
return ;
}
最新文章
- PHP实现RTX发送消息提醒
- arcgis api for js共享干货系列之二自定义Navigation控件样式风格
- github无法访问?试试修改hosts
- 去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码
- ios开发入门篇(三):UITableView简介
- Application.mk中APP_ABI 的含义
- TreeSet集合排序方式二:定制排序Comparator
- 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7
- 那些年我们一起用过的Hybrid App
- 浅析java程序的执行过程
- Java 连接 MySQL 数据库
- mac 删除文件不经过废纸篓解决办法
- 机器学习入门07 - 验证 (Validation)
- Ftp、Ftps与Sftp之间的区别
- mysql的group by查询
- Python爬虫(一)——开封市58同城租房信息
- Set ";$USE_DEPRECATED_NDK=true"; in gradle.properties to continue using the current NDK integration. 解决办法
- MySQL无损复制(转)
- visual studio Lua 调试
- TessorFlow学习 之 手写数字识别的搭建