水库 (树形dp)

R国有n座城市和n-1条长度为1的双向道路,每条双向道路连接两座城市,城市之间均相互连通。现在你需要维护R国的供水系统。你可以在一些城市修建水库,在第i个城市修建水库需要每年c_i的维护费用。对于没有修建水库的城市,如果离它最近的水库的距离为d,那么需要每年t_i的运输费用来保证该城市的用水需求。保证t_i严格递增。你的任务是计算出每年所需要的最小花费。对于10%的数据,\(n<=5\)。对于30%的数据,\(n<=20\)。对于另外40%的数据,\(t_i=i\)。对于100%的数据,\(n<=1000\),\(c_i,t_i<=100000\)。

这可能算是我做的第一道树形dp?i表示以i为根的子树,j表示i的供水依赖于j。k为i的子节点。\(dp[i][j]=t[dis[now][j]]+c[j]+\sum min(dp[k][j]-c[j],best[k])\)。也就是说对于i的子树,要么i和k共用一个水库,要么用的水库不一样。如果是共用水库,说明水库不用重复建,那么建造水库的成本可以省掉。

但是我在思考过程中发现这样一种情况:

这个情况。。hjq大神说可以证明不存在。因为既然j也选了,t也选了,i一定是哪个更近选哪个。所以i一定不会选j。(被自己蠢哭了)

#include <cstdio>
#include <algorithm> const int maxn=1005, INF=1e9; class Graph{
public:
struct Edge{
int to, next; Graph *belong;
void set(int x, int y, Graph *g){
to=x; next=y; belong=g; }
Edge& operator ++(){
return *this=belong->edge[next]; }
inline int operator *(){ return to; }
};
void addedge(int x, int y){
edge[++cntedge].set(y, fir[x], this);
fir[x]=cntedge;
}
inline Edge& getlink(int x){ return edge[fir[x]]; }
private:
int cntedge, fir[maxn];
Edge edge[maxn*2];
}; int n, c[maxn], t[maxn];
int f[maxn][maxn], best[maxn];
int dis[maxn][maxn];
Graph g; void get_dis(int now, int step, int source, int pre){
dis[now][source]=dis[source][now]=step;
Graph::Edge e=g.getlink(now);
for (; *e; ++e) if (*e!=pre)
get_dis(*e, step+1, source, now);
} void dfs(int now, int par){
Graph::Edge e=g.getlink(now);
for (int j=1; j<=n; ++j) f[now][j]=t[dis[now][j]]+c[j];
for (; *e; ++e){
if (*e!=par) dfs(*e, now);
else continue;
for (int j=1; j<=n; ++j)
f[now][j]+=std::min(f[*e][j]-c[j], best[*e]);
}
for (int j=1; j<=n; ++j)
best[now]=std::min(best[now], f[now][j]);
} int main(){
scanf("%d", &n);
for (int i=1; i<=n; ++i) scanf("%d", &c[i]);
for (int i=1; i<=n; ++i) scanf("%d", &t[i]);
int x, y;
for (int i=1; i<n; ++i){
scanf("%d%d", &x, &y);
g.addedge(x, y); g.addedge(y, x);
}
for (int i=1; i<=n; ++i) get_dis(i, 0, i, 0);
std::fill(best, best+maxn, INF);
dfs(1, 0);
printf("%d\n", best[1]);
return 0;
}

水库(树形dp)的更多相关文章

  1. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  2. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  3. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  4. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  5. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  6. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  7. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  8. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  9. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

随机推荐

  1. 分享知识-快乐自己:Liunx 搭建 Dubbo

    1.首先配置JDK  操作步骤 2.部署 Tomcat ① 上传 Tomcat 7  解压jdk文件:tar -zxvf jdk文件名称 ② tomcat目录下的bin/启动tomcat ③ tail ...

  2. python_doc 读写docx文件

    python读写word文档有现成的库可以处理,在这里采用了 python-docx. 首先先安装 pip install python-docx #!/usr/bin/env python # -* ...

  3. codeforces 598C C. Nearest vectors(极角排序)

    题目链接: C. Nearest vectors time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. JSTL标签提示:"items" does not support runtime expressions

    今天在使用JSTL的 c:forEach 标签时,jsp提示:"items" does not support runtime expressions,后来才发现是因为taglib ...

  5. OpenCV——百叶窗

    参考: PS 图像特效,百叶窗 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLU ...

  6. 说几个JS优化技巧吧

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  7. bzoj1067降雨量

    True和False都好搞 Maybe的情况: 1.Y年和X年的降雨量已知,X年的降雨量不超过Y年的降雨量,从Y+1到X-1年中存在至少一年的降雨量未知,从Y+1到X-1年中已知的降雨量都小于X年的降 ...

  8. git导入项目

    远程仓库已经存在,使用的是gitblit,作为终端eclipse如何从中拷贝代码呢? 0.准备工作,windows->preference->team->git->config ...

  9. BZOJ2548:[CTSC2002]灭鼠行动

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  10. 问题:OAuth2.0;结果:帮你深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题. 豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒 ...