当前位置:网站首页>HDU1561 树形背包dp+边界优化 0ms过题
HDU1561 树形背包dp+边界优化 0ms过题
2022-08-02 14:26:00 【Shanhj】
对比网上各种版本的代码,主要优化为减少了无用计算,从原来的75ms降低至0ms
优化细节见代码注释
#include <bits/stdc++.h>
#define mem(a, v) memset(a, v, sizeof(a))
const int N = 205;
using namespace std;
struct edge
{
int to, next;
} e[N];
int head[N], ecnt;
void add(int u, int v) {
e[++ecnt].next = head[u], e[ecnt].to = v, head[u] = ecnt; }
int n, m, sz[N]; // sz[i]记录结点i的子结点数
int dp[N][N], val[N];
void einit(int n)
{
ecnt = 0;
for (int i = 0; i <= n; i++)
head[i] = 0;
}
void getsize(int u) //计算子结点数
{
sz[u] = 1;
for (int i = head[u]; i; i = e[i].next)
{
getsize(e[i].to);
sz[u] += sz[e[i].to];
}
}
void dfs(int u, int M) // M是当前层最多能攻取的城堡数,每递归一层就减一
{
dp[u][1] = val[u];
int v, szcnt = 1;
for (int i = min(sz[u], M); i >= 2; i--)
dp[u][i] = 0;
for (int i = head[u]; i; i = e[i].next)
{
v = e[i].to;
dfs(v, M - 1);
szcnt += sz[v]; // szcnt是当前子结点的数量和,用于确定j的边界
for (int j = min(szcnt, M); j >= 2; j--) //从大的往小推,否则会出现包含关系
{
//要保证v之前的结点数之和要不小于j-k,否则解不存在
int k1 = max(sz[v] + j - szcnt, 1);
//同时k不能超过j-1或sz[v]
int k2 = min(sz[v], j - 1);
for (int k = k1; k <= k2; k++) //从结点v攻取k个城堡
dp[u][j] = max(dp[u][j], dp[u][j - k] + dp[v][k]);
}
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int a;
val[0] = 0;
for (int i = 0; i < N; i++)
dp[i][0] = 0;
while (cin >> n >> m && n && m)
{
einit(n + 1);
m++;
for (int i = 1; i <= n; i++)
{
cin >> a >> val[i];
add(a, i);
}
getsize(0);
dfs(0, m);
cout << dp[0][m] << "\n";
}
return 0;
}
边栏推荐
猜你喜欢
随机推荐
集成电路实践----D触发器
对象和类总结
什么是Knife4j?
lammps聚合物建模——EMC
基于mobileNet实现狗的品种分类(迁移学习)
web渗透之sql注入
CNN鲜花分类
两分钟录音就可秒变语言通!火山语音音色复刻技术如何修炼而成?
解决(An error happened during template parsing (template: “class path resource [templates/...]
this beta version of Typora is expired, please download and install a newer version.Typora的保姆级最新解决方法
2022-07-28 第六小组 瞒春 学习笔记
H5中的拖放(Drag 和 Drop)
lammps学习(二)联合原子模型聚乙烯拉伸
EL 表达式 & JSTL 标签库
事件对象,事件流(事件冒泡和事件捕获)、事件委托、L0和L2注册等相关概念及用法
XML技术
基于Visual Studio 2015的CUDA编程(一):基本配置
为什么四个字节的float表示的范围比八个字节的long要广
有效的括号【暴力、分支判断、哈希表】
页面返回顶部和固定导航栏js基础案例