1.火车站开饭店

最大独立集裸题

 #include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #include<algorithm>
 #include<string>
 #define N 200000+20
 using namespace std;
 ];
 ;
 void link(int x,int y){
     nxt[++tot]=head[x];
     to[tot]=y;
     head[x]=tot;
 }
 void dfs(int x,int fa){
     dp[x][]=a[x];//0为在独立集里
     dp[x][]=;//1为不在
     for (int i=head[x];i;i=nxt[i]){
         if (to[i]==fa) continue;
         dfs(to[i],x);
         dp[x][]+=dp[to[i]][];
         dp[x][]+=max(dp[to[i]][],dp[to[i]][]);
     }
 }
 int main(){
     scanf ("%d",&n);
     ;i<=n;++i) scanf ("%d",&a[i]);
     int x,y;
     ;i<n;++i){
         scanf ("%d%d",&x,&y);
         link(x,y),link(y,x);
     }
     dfs(,);
     printf (][],dp[][]));
     ;
   }

2.树的最小染色

考题 当时只打了两个状态 居然用我神奇的调试功力搞了10分?

考完之后愣是想了好久才想通 好像是最小支配集

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define maxn 300000
#define INF 10000100
using namespace std;
,root=,sum,f[maxn][],ans=,g[maxn],sz[maxn];
void link(int x,int y)
{
    nxt[++tot]=head[x];
    to[tot]=y;
    head[x]=tot;
}
void dfs(int x)
{
    if (!sz[x])//0 靠爸爸 1 靠儿子 2 靠自己
    {
        f[x][]=,f[x][]=INF>>,f[x][]=v[x];
        return ;
    }
        ,fl=;
    for (int i=head[x];i;i=nxt[i])
    {
        int t=to[i];
        dfs(t);
        f[x][]+=min(f[t][],min(f[t][],f[t][]));
        f[x][]+=f[t][];
        ]>=f[t][]) fl=,s2+=f[t][];
        ],s1=min(s1,f[t][]-f[t][]);
    }
    f[x][]+=v[x];
    f[x][]=s2;
    ]+=s1;
}
int main()
{
    int n;
    scanf ("%d",&n);
    ;i<=n;++i)
    {
        int x,y,z,k;
        scanf ("%d%d%d",&x,&y,&z);
        v[x]=y,sz[x]=z;
                ;j<=z;++j)
        {
            scanf ("%d",&k);
            link(x,k);
            g[k]=;
        }
    }
    ;i<=n;++i) if (!g[i]) root=i;
    dfs(root);
    cout<<min(f[root][],f[root][]);
    ;
}    

3.POJ 3659 Cell Phone Network

最小支配集  模板题 另外我发现我真的很喜欢打靠爸爸靠儿子还是靠自己之类的话23333

 #include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #include<algorithm>
 #include<string>
 #define ll long long
 #define db double
 #define N 20000
 #define inf 1000000000
 using namespace std;
 ];
 ;
 void link(int x,int y){
     nxt[++tot]=head[x];
     to[tot]=y;
     head[x]=tot;
 }
 void dfs(int x,int fa){
     dp[x][]=,dp[x][]=,dp[x][]=;//0属于 1靠儿子 2靠父亲
     ,q=inf;
     for (int i=head[x];i;i=nxt[i]){
         int t=to[i];
         if (t==fa) continue;
         dfs(t,x);
         dp[x][]+=min(dp[t][],min(dp[t][],dp[t][]));
         ]!=inf&&dp[x][]!=inf) dp[x][]+=dp[t][];
         ]=inf;
         ]>=dp[t][]) dp[x][]+=dp[t][],fl=t;
         ]+=dp[t][];
         q=min(q,dp[t][]-dp[t][]);
     }
     ]+=q;
     ])  dp[x][]=inf;
 }
 int main(){
     int n;
     scanf ("%d",&n);
     int x,y;
     ;i<n;++i){
         scanf ("%d%d",&x,&y);
         link(x,y),link(y,x);
     }
     dfs(,);
     printf (][],dp[][]));
     ;
   }

4.POJ 2152 消防站

神题啊qwq 怎么推的出(瘫

围观了一下dalao的论文感觉很有道理又觉得不是很明白

后来翻到:http://blog.csdn.net/loi_dqs/article/details/50878337 在吸取了论文部分内容的基础上很快就明白了

 #include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #include<algorithm>
 #include<string>
 #include<queue>
 #include<vector>
 #define ll long long
 #define db double
 #define N 5000
 using namespace std;
 ;
 int w[N],d[N],k[N],de[N][N],ans[N],f[N][N];
 struct hh{
     int to,nxt,w;
 }b[N];
 int head[N];
 void link(int x,int y,int w){
     b[++tot].nxt=head[x];
     b[tot].to=y;
     b[tot].w=w;
     head[x]=tot;
 }
 void dis(int x,int y,int fa,int di){
     de[x][y]=min(de[x][y],di);
     for (int i=head[y];i;i=b[i].nxt){
         int v=b[i].to;
         if (v==fa) continue;
         dis(x,v,y,di+b[i].w);
     }
 }
 void dp(int x,int fa){
     for (int i=head[x];i;i=b[i].nxt){
         int t=b[i].to;
         if (t==fa) continue;
         dp(t,x);
     }
     ;i<=n;++i){
         if (de[x][i]>d[x]) continue;
         f[x][i]=w[i];
         for (int j=head[x];j;j=b[j].nxt){
             int k=b[j].to;
             if (k==fa) continue;
             f[x][i]+=min(f[k][i]-w[i],ans[k]);
         }
         ans[x]=min(ans[x],f[x][i]);
     }
 }
 int main(){
     scanf ("%d",&n);
     ;i<=n;++i) scanf ("%d",&w[i]);
     ;i<=n;++i) scanf ("%d",&d[i]);
     int x,y,z;
     ;i<n;++i){
         scanf ("%d%d%d",&x,&y,&z);
         link(x,y,z);link(y,x,z);
     }
     memset(f,0x3f,sizeof(f));
     memset(de,0x3f,sizeof(de));
     memset(ans,0x3f,sizeof(ans));
     ;i<=n;++i) dis(i,i,,);
     dp(,);
     printf (]);
     ;
   }

UPD        2017_07_12

连考两天树形dp我都在鬼混 感觉很不好意思TAT(之前可能是白学了)(那个白学 不是那个白学)

发现了一点小套路?

感觉这一类题经常可以用两个dp的数组分别搞然后分情况转移合并 这样思路比较简单

也可以设三个左右状态互相转移 实现起来会更清爽qwq

然后好像经常设的都是N×M之类的 一般要数据范围别太大才能玩吧

状态大多跟父节点 子节点 子树的个数 在不在某状态中 一类有关qwq

还需多多领悟啊= =

树形dp系列的更多相关文章

  1. HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  2. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  3. 树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]

    题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 ...

  4. 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)

    总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...

  5. 【BZOJ-1864】三色二叉树 树形DP

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 659  Solved: 469[Submit][Status] ...

  6. 代码风格与树形DP

    Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死. 看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到 ...

  7. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  8. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  9. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...

随机推荐

  1. 解决WebSocket兼容ie浏览器版本问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7942323.html 在使用Netty进行WebSocket开发时,测试发现:ie 11系列个别低版本连接W ...

  2. KNN--用于手写数字识别

    优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型   一般流程:     (1). 收集数据(网络抓取)     (2).处理数据,将数据处 ...

  3. Mysql--单表数据记录查询

    1.简单数据记录查询 1.1 简单数据查询 1.1.1 查询所有字段数据 例子:      1.1.2 "*"符号的使用 语法: 例子: 1.1.3 查询指定字段数据 例子:   ...

  4. static,final,包,访问修饰符,内部类

    static 关键字可以修饰成员变量,被static修饰的成员变量归属于类static关键字可以修饰成员方法:被static修饰的成员方法可以直接使用类名调用,也可以通过对象调用,建议使用类名.非静态 ...

  5. 利用python对excel进行数据剔除

    需求分析: 判断excel2表中的某个唯一字段是否满足条件,如果满足条件,就在excel1中进行查询,若存在excel中,就将该数据进行剔除. python脚本的实现: from __future__ ...

  6. Web Api 2.0中使用Swagger生成Api文档的2个小Tips

    当Web Api 2.0使用OAuth2授权时,如何在Swagger中添加Authorization请求头? Swagger说明文档支持手动调用Api, 但是当Api使用OAuth2授权时,由于没有地 ...

  7. POJ 1151 Wormholes spfa+反向建边+负环判断+链式前向星

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 49962   Accepted: 18421 Descr ...

  8. 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层

    这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...

  9. Python的用户交互程序及格式化输出

    1.  用户输入 在Python 3 中,用户输入用input()函数即可实现用户交互程序. 例如,我们根据程序提示输入用户名和密码,并且打印输入的信息. 2. 字符串格式化输出 例如,我们根据程序提 ...

  10. Solr服务在Linux上的搭建

    一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...