https://vijos.org/p/1518

这题代码我基本是抄的,实在太难想了。但是也学到了一些东西。

比如:多叉树转二叉树存,这个细细一想,确实使得在dfs的时候,实现起来方便很多。

说一说具体 dfs的思路,思路和网上那个一模一样的,我刚学树形dp,可能上网看看总结下套路比较好。

设dfs(cur, hasPoint, k, dis)表示,现在处理到cur这个节点,离cur最近的那个仓库节点是hasPoint, 剩下k次设置仓库的机会,还有就是cur的爸爸距离hasPoint的距离。

dfs的时候,对于当前的这个cur点,要么设置为仓库,要么不设。

那么,对于这个cur节点的子树,分配多少次设置工厂的机会给它,也要暴力枚举。

Lchild[cur] cur这个节点的儿子

Rchild[cur] cur这个节点的兄弟

然后dfs下去,我也不知道具体怎么说了。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 1e2 + ;
int Lchild[maxn], Rchild[maxn], dp[maxn][maxn][maxn];
int a[maxn], fa[maxn], len[maxn];
int dfs(int cur, int hasPoint, int k, int dis) {
if (cur == - || hasPoint == -) return ;
if (dp[cur][hasPoint][k] != inf) return dp[cur][hasPoint][k];
int &now = dp[cur][hasPoint][k]; //引用改值
for (int i = ; i <= k; ++i) { //这个cur节点不做中转站。
now = min(now, dfs(Lchild[cur], hasPoint, i, dis + len[cur]) + dfs(Rchild[cur], hasPoint, k - i, dis) + a[cur] * (dis + len[cur]));
}
for (int i = ; i < k; ++i) { // 这个点用来中转
now = min(now, dfs(Lchild[cur], cur, i, ) + dfs(Rchild[cur], hasPoint, k - i - , dis));
}
return dp[cur][hasPoint][k];
}
void work() {
int n, k;
cin >> n >> k;
memset(dp, 0x3f, sizeof dp);
memset(Lchild, -, sizeof Lchild);
memset(Rchild, -, sizeof Rchild);
for (int i = ; i <= n; ++i) {
cin >> a[i] >> fa[i] >> len[i];
Rchild[i] = Lchild[fa[i]];
Lchild[fa[i]] = i;
}
cout << dfs(, , k, ) << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

最新文章

  1. 【WMware】关于VMware服务器虚拟化管理之服务器容量扩充
  2. camerc文件播放
  3. Redis设计与实现-主从、哨兵与集群
  4. Nginx 笔记与总结(13)Nginx 的 gzip 压缩
  5. NOIP199904求Cantor表
  6. solr5.2.1环境搭建教程
  7. vi编辑器选项
  8. 0c-38-ARC快速入门
  9. DbHelperSQL 判断数据库表结构公用方法
  10. Google Chrome 55 Released – Install on RHEL/CentOS 7/6 and Fedora 25-20
  11. js 定义函数的几种方法 以及如何调用
  12. HTML 标记
  13. NYOJ 417 死神来了 鸽巢原理
  14. 快递单号查询免费api接口(PHP示例)
  15. NewLife.Net——开始网络编程
  16. mybatis3源码阅读之SqlSessionFactoryBuilder
  17. Manjaro 安装svn客户端,以及checkout使用命令
  18. JavaScript大厦之JS运算符
  19. spark性能调优(二) 彻底解密spark的Hash Shuffle
  20. 1.cassandra的搭建

热门文章

  1. 文件批量转换成UTf-8
  2. Ruby map、each、select、inject、collect 、detect reference
  3. linux子系统的初始化_subsys_initcall()
  4. HDU2102 A计划 —— BFS
  5. hadoop异常:Be Replicated to 0 nodes, instead of 1
  6. Android中的Handler,以及用Handler延迟执行
  7. I.MX6 boot from Micro SD
  8. web自动化测试的自身特点
  9. http基础知识摘录
  10. 微信小程序在线支付功能使用总结