越发向dp深入越发现dp越有意思!

  

这道题做的时候感觉十分的难,然后看完学长的题解恍然大悟。设状态不好导致想了一中午,一直感觉不可做,其实是自己的状态设的不对,这道题呢,首先是一个求在树上建多个厂,而也有一道类似的邮箱设置问题,这个则是在坐标轴上设邮局,但那个是四边形不等式优化的区间dp,这个则是一道树形dp了。

先设状态吧,f[i][0/1]表示第i个点建厂不建厂,发现有点问题你不知道距离i点最近的是哪个地方,于是多加一维表示距离最近的一个厂,这时发现还可以设几个厂没有体现出来那0/1发现可以省掉,直接替换,最后f[i][j][k]表示距离i点最近的有厂的j点,此时i点还可设k个厂,这就很显然了~\(^o^)/~

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<cmath>
#include<ctime>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#define mod 1000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int maxn=;
int n,k,u=;
int v[maxn],dis[maxn];
int f[][][];//f[i][j][k]表示对于第i个点距离它最近的厂为点j,其中选择建立了k个厂
int rx[maxn],ls[maxn];//左儿子,右兄弟
int dfs(int x,int root,int k,int d)//x当前节点root距离x最近节点k表示还能再建几个厂d表示积累的距离
{
if(x==-)return ;
if(f[x][root][k]!=u)return f[x][root][k];
for(int i=;i<=k;i++)//如果当前节点不建厂
{
int r=dfs(rx[x],root,i,d);
int l=dfs(ls[x],root,k-i,d+dis[x]);
int ans=(d+dis[x])*v[x];
f[x][root][k]=min(f[x][root][k],l+r+ans);
}
for(int i=;i<k;i++)//当前选择建厂
{
int r=dfs(rx[x],root,i,d);
int l=dfs(ls[x],x,k-i-,);
f[x][root][k]=min(f[x][root][k],l+r);
}
return f[x][root][k];
}
int main()
{
//freopen("1.in","r",stdin);
memset(rx,-,sizeof(rx));
memset(ls,-,sizeof(ls));
n=read();k=read();
for(int i=;i<=n;i++)
{
int x;
v[i]=read();//当前节点生产出来的木块
x=read();//i节点的父亲
dis[i]=read();//i到x的距离
rx[i]=ls[x];ls[x]=i;
}
memset(f,,sizeof(f));
u=f[][][];
printf("%d\n",dfs(,,k,));
return ;
}

每个人都在追求成功,我呢,快乐就好啊。   ——等一个人咖啡

树形dp的深入讨论的更多相关文章

  1. 【BZOJ-3572】世界树 虚树 + 树形DP

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1084  Solved: 611[Submit][Status ...

  2. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  3. HDU5647 DZY Loves Connecting 树形DP

    (先奉上jcvb大神的官方题解)BC 76 div 1 1002 对于每个结点i,统计出f[i]表示包含i的连通集有多少个,那么容易看出答案就是所有f[i]的和. 要计算f[i]是经典的树形DP问题. ...

  4. codeforces 212E IT Restaurants(树形dp+背包思想)

    题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...

  5. 动态规划——树形dp

    动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...

  6. Day1:T3 bfs T4 树形DP

    T3:BFS 回看了一下Day1的T3...感觉裸裸的BFS,自己当时居然没有看出来... 同时用上升和下降两种状态bfs即可 这一题还要注意一个细节的地方,就是题目要求的是求往返的最优解 k=min ...

  7. [SinGuLaRiTy] 树形DP专项测试

    [SinGuLaRiTy-1015] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有的题目:Time Limit:1s  |  Me ...

  8. 宝藏(树形DP)

      这道题目是十分考验思维的,n^2应该还是比较好想的,主要是如何转移根的问题.转移根,在我看来应该是树形dp最难的一部分了, 一般学会如何转移根,也就差不多考验通吃树形dp了. 下面转一转大佬链接: ...

  9. 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...

随机推荐

  1. Spring Boot 应用 发布到Docker

    Spring Boot 应用 先把命令行切换到Maven项目的根目录 E:\gitCode\galaxyguardians 通过mvn clean package命令打包应用程序 ,在E:\gitCo ...

  2. 安装polyglot出错

    安装polyglot出错 错误 Complete output from command python setup.py egg_info: Traceback (most recent call l ...

  3. 你知道element中el-table的列名中不能含有" . "吗?

    [本文出自天外归云的博客园] Vue+element比较流行,但是element有个坑,就是element的表格列名中不能含有点儿" . ",否则数据都显示不出来. 在elemen ...

  4. MXNET:卷积神经网络基础

    卷积神经网络(convolutional neural network).它是近年来深度学习能在计算机视觉中取得巨大成果的基石,它也逐渐在被其他诸如自然语言处理.推荐系统和语音识别等领域广泛使用. 目 ...

  5. Visual自动添加CSS兼容前缀

    安装方法 打开vs code 的 扩展 ---> 搜索 Autoprefixer,并安装. 使用方法 打开css文件,按F1,选择 Autoprefix CSS 这条命令 没执行命令之前: 执行 ...

  6. TCP/IP模型及OSI七层参考模型各层的功能和主要协议

    注:网络体系结构是分层的体系结构,学术派标准OSI参考模型有七层,而工业标准TCP/IP模型有四层.后者成为了事实上的标准,在介绍时通常分为5层来叙述但应注意TCP/IP模型实际上只有四层. 1.TC ...

  7. C++ 智能指针一

    /* 智能指针shared_ptr */ #include <iostream> #include <string> #include <memory> //智能指 ...

  8. Git -- 搭建git服务器

    在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想 ...

  9. 【QT】对话框打开图像并用QPixmap显示

    绘图设备是指继承QPaintDevice的子类,可以使用QPainter直接在其上面绘制图形,Qt一共提供了四个这样继承QPaintDevice的绘图设备类. 分别是QPixmap.QBitmap.Q ...

  10. 《JavaWeb程序开发入门》课后题

    第一章 1.请编写一个格式良好的XML文档,要求包含足球队一支,队名为Madrid,球员5人:Ronaldo.Casillas.Ramos.Modric.Benzema:篮球队一支,队名为Lakers ...