POJ 2152 Fire
算是我的第一个树形DP 的题:
题目意思:N个城市形成树状结构。现在建立一些消防站在某些城市;每个城市有两个树形cost(在这个城市建立消防站的花费),limit ;
我们要是每个城镇都是安全的:就是每个距离这个城镇最近的消防站不能超过这个城镇的limit值;
解法:这个题目乍一看卧槽怎么玩!玩不了啊!先给出dp[i][j]( I 依靠J,并且 I 这课子树都已经被覆盖的最优解(不一定都被J覆盖));
假设一个节点的亲儿子树都被解决完毕,我们对于这些 亲儿子树 和这个 节点所组成的树的解如何得出?
初始化dp[i][j]=cost[j];
无疑使枚举这个节点I 依靠的节点,然后得出最小值;
而这些 亲子树的合并无疑有俩情况
1:这些亲儿子树依靠这个节点J 值 dp[k][j]-cost[j];
2:这些亲儿子树不依靠这个节点I 值
{
int best=0x7fffffff;
for(int w=1;w<=n;w++)
best=min(dp[k][w],best);
>>>best;
}
所以我们要开一个数字组维护每个节点的最值;
我输得不清楚那么百度下“国家集训队2006论文集 陈启峰”
#include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> using namespace std; const int maxn=1004; const int INF=0x7fffffff; struct Edge {int to,dis,pre;Edge(int to=0,int dis=0,int pre=0):to(to),dis(dis),pre(pre){} }; Edge edge[maxn*2]; int head[maxn],pos; int dp[maxn][maxn]; int dis[maxn][maxn]; int limit[maxn],cost [maxn]; int best[maxn]; int n,start;void inint() {for(int i=1;i<maxn;i++){best[i]=INF;for(int j=1;j<maxn;j++)dp[i][j]=INF;}memset(head,-1,sizeof(head));pos=0; } void add_edge(int s,int to,int dis) {edge[pos]=Edge(to,dis,head[s]);head[s]=pos++; } void DIS(int pa,int s) {for(int i=head[s];~i;i=edge[i].pre){Edge &tmp=edge[i];if(tmp.to==pa)continue;dis[start][tmp.to]=dis[start][s]+tmp.dis;DIS(s,tmp.to);} } void dfs(int pa,int s) {for(int i=head[s];~i;i=edge[i].pre){Edge &tmp=edge[i];if(tmp.to==pa)continue;dfs(s,tmp.to);}for(int i=1;i<=n;i++)if(dis[s][i]<=limit[s]){dp[s][i]=cost[i];for(int j=head[s];~j;j=edge[j].pre){Edge &tmp=edge[j];if(tmp.to==pa)continue;dp[s][i]+=min(dp[tmp.to][i]-cost[i],best[tmp.to]);//加等}best[s]=min(best[s],dp[s][i]);} } int main() {int t;int a,b,c;scanf("%d",&t);while(t--){inint();scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&cost[i]);for(int i=1;i<=n;i++)scanf("%d",&limit[i]);for(int i=2;i<=n;i++){scanf("%d%d%d",&a,&b,&c);add_edge(a,b,c);add_edge(b,a,c);}for(int i=1;i<=n;i++)start=i,DIS(-1,i);dfs(-1,1);printf("%d\n",best[1]);}return 0; }
转载于:https://www.cnblogs.com/shuly/p/3877105.html
POJ 2152 Fire相关推荐
- POJ 2152 fire / SCU 2977 fire(树型动态规划)
POJ 2152 fire / SCU 2977 fire(树型动态规划) Description Country Z has N cities, which are numbered from 1 ...
- poj 2152 Fire - 经典树形dp
题目链接: http://poj.org/problem?id=2152 不多说.. 2006 陈启峰消防站解题报告 这dp简直是神了.. #include <cstdio> #inclu ...
- POJ 2152 Fire(树形DP)
题意: 思路:令F[i][j]表示 的最小费用.Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用. 好难的题... 1 #include<algorithm> 2 # ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- POJ 2152 树型DP //很棒的题
题意:Z国有n个城市,从1到n给这些城市编号.城市之间连着高速公路,并且每两个城市之间有且只有一条通路.不同的高速公路可能有不同的长度.最近Z国经常发生火灾,所以当地政府决定在某些城市修建一些消防站. ...
- poj 2152 树形dp(建立消防站)
题意:给定n个节点组成的树,树边有权.现在要在一些点上建立消防站,每个点建站都有花费cost[i].如果某点上没有消防站,那么在距离它d[i]之内的某个点上必须有消防站.求符合上述条件的最小费用建站方 ...
- 【缄*默】 #DP# 各种DP的实现方法(更新ing)
DP =「状态」+「阶段」+「决策」 基本原理 = 「有向无环图」+「最优子结构」+「无后效性」 目录 一. 线性DP { 1.概念引入 } { 2.例题详解 } [例题1]caioj 1064 最长 ...
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
- POJ 动态规划题目列表
1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易: 1018, 1050 ...
最新文章
- 牛客网_剑指Offer_Python实现_更新中
- 太棒啦!PyCharm与Jupyter完美融合,Jupytext来啦!
- 根据卡号获取银行卡名字
- 如何扩展以太坊:分片
- unity------------------------------transform.forward与Vector.forward的区别
- mybatis和hibernate的区别---Mybatis的学习笔记(四)
- c语言程序输入n个数字排序,输入n个数字然后进行排序,用C语言编写。注意是n个数啊,不是确定的个数。...
- python中缩进在程序中_python代码缩进
- 信息学奥赛一本通(1021:打印字符)
- 查找文章中出现频率最高的单词
- JQUERY--图片轮换superslide(
- 公平的反义词是什么?
- zabbix 系统IO监控_自动发现
- 学单片机的动力是什么,学单片机来做什么,需要多长时间把它学会
- Eigen编译_Eigen向量化_内存对齐 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
- OFD文件在线阅读器
- 在CentOS8下安装搭建gitlab下载安装备份升级迁移记录
- 四层七层负载均衡区别
- macbook系统占用硬盘大_苹果电脑系统占用硬盘过大,怎么解决
- [一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”
热门文章
- 基于UDP/TCP的网络协议(端口分配)
- Eclipse安装Perl插件
- python邮件转发_把Gmail邮件转发到gtalk的Python方法
- 依据imu姿态角计算z轴倾角_1. 姿态的表示方法
- python做excel数据分析统计服_Python也能做到Excel那样,条件统计轻松解决工作需求...
- matlab 点云特征_基于点云的3D障碍物检测
- pytorch test单张图片_PyTorch版EfficientDet比官方TF实现快25倍?这个GitHub项目数天狂揽千星...
- c语言数组中两元素交换,如可交换两个数组中的元素?
- 对promise.all底层的实现的研究
- Python打卡第四周