博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【树形dp入门】UVA-12186 + HDU - 1520(白白wa掉的同学看过来!!)
阅读量:4144 次
发布时间:2019-05-25

本文共 2672 字,大约阅读时间需要 8 分钟。

看着很玄幻,其实也就是dfs+dp。

然后满足那么一个关系,在一个树上,有上级下级树形关系

uva12186是紫书上的题目。

需要注意题目:每层只要它的直接下属来就好了,不用考虑到所有底层员工,按照书上给的式子,c=(k*T-1)/100+1

每次这样来就可以了

之后贪心选取花费最少的。

写的时候遇到一点小问题:

if(d[dd]==0) d[dd]=dfs(dd);

v.push_back(d[dd]);

(我喜欢这么写清楚一点.... )这里要注意d[dd]要赋值,不然dfs跑一遍,返回一个ans要存储下来,不然浪费掉了

还有就是读入边的时候,不要读反了(最好画个图)

最后就是思路很重要,好好想想怎么实现,感觉还是挺神奇的

关于式子有点小问题,实验了一下,写成下面这种也可以,取整罢了。。。。

我最开始还被吓死了。。。答案是一样的,就是注意转换成double再ceil

#include
#include
#include
#include
#include
using namespace std;int n; int p;int a[100005];int d[100005];vector
g[100005];int dfs(int x) { // this time ,how will we start our journey //let's first find what we need // we got 0 at first , we want to see the sons of 0 // and if it reaches the end(g[i]==0) //returns an ans if (g[x].size() == 0)return 1; // do you know that ! he is 1 int sum = 0; vector
v; for (int i = 0; i
> n >> p) { if (n == 0 || p == 0)return 0; memset(d, 0, sizeof(d)); for (int i = 0; i <= n; i++)g[i].clear(); int u, v; for (int i = 1; i <= n; i++) { cin >> u;//just get father // u is father //BUT!!! DO REMEMBER WHO IS U IN THE TITLE //BUT!!! DO REMEMBER WHO IS U IN THE TITLE g[u].push_back(i); // cout << u << "-------" << g[u].size() << endl; } cout << dfs(0) << endl; } return 0;}

HDU 1512 

另外,这个代码习惯不好。。。 不用if(xxx==0)bfs(xxx)直接后面的就好了

因为bfs里面是五环的(没有环 树上)

如果是无根的 双向边 可以加个-1访问标记(加个1的 bool比int快和省空间。。。。 )

还有注释写了一堆写的我好烦(不)一堆的写在外面  注释 在干嘛的写在里面

#include
#include
#include
#include
#include
using namespace std;int a[6005]; //happy- numbersint n;int fa[6005];// finds final fatherint dp[6005][2];vector
g[6005];void dfs(int x) { //dp[x][1] = a[x]; // 记得这里初始化!!!!! //if he goes we can get happy number like so //but he has many employee //so he needs to do many times int sum0 = 0; int sum1 = 0; for (int i = 0; i
> n) { memset(dp, 0, sizeof dp); memset(fa, -1, sizeof(fa)); for (int i = 1; i <= n; i++)cin >> dp[i][1],g[i].clear();//happy numbers int u, v; while (cin >> u >> v) { // u is father if (u == 0 && v == 0)break; g[v].push_back(u); fa[u] = v; } //after that finds father first // go back for others int rec = 1; while (fa[rec] != -1)//if have changed continues searching { rec = fa[rec]; } //fa[1] //***这里final fa其实是5 //rec is the final father dfs(rec);//get all resulus cout << max(dp[rec][0], dp[rec][1]) << endl; } return 0;}

HDU这个题.....  laji/....

Hdu是多组数据,,..  即使没说,用了while和memset就a了

终于明白这个是在讲什么了.. 没有数据的生活真的好苦(手再)

zj说 这需要经验 经验 经验

同样的标题 复制进去 找URAL交  accept

........但是人家数据不公开啊

hdu啊hdu(滑稽)

 

你可能感兴趣的文章
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(三)
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>