zoukankan      html  css  js  c++  java
  • codevs 1746 贪吃的九头龙

    /*
    状态定义的没错 就是考试的时候傻啦吧唧的转移左右孩子
    其实之转移父亲就简单多了 不用考虑那么多
    还有就是偷懒没有把谁有没有找过这个信息转过去
    而是搞了个全局变量…wa到挺
    再就是特盘的时候还有终止条件写的不好
    写的时间也很长 …..
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 510
    #define inf 0x3f3f3f3f
    using namespace std;
    int n,m,K,num,head[maxn],fa[maxn],lc[maxn],rc[maxn],dis[maxn];
    int son[maxn][maxn],s[maxn],f[maxn][maxn][2],V[maxn];
    struct node{int u,v,t,pre;}e[maxn*2];
    void Add(int from,int to,int dis)
    {
        num++;e[num].u=from;
        e[num].v=to;e[num].t=dis;
        e[num].pre=head[from];
        head[from]=num;
    }
    void Dfs(int now,int from)
    {
        fa[now]=from;
        for(int i=head[now];i;i=e[i].pre)
          if(e[i].v!=from)
            {
              son[now][++s[now]]=e[i].v;
              dis[e[i].v]=e[i].t;
              Dfs(e[i].v,now);
            }
    }
    void Build()
    {
        for(int i=1;i<=n;i++)
          for(int j=1;j<=s[i];j++)
            {
              int u=i,v=son[i][j];
              if(lc[u]==0){lc[u]=v;continue;}
              u=lc[u];while(rc[u])u=rc[u];
              rc[u]=v;
            }
    }
    int C(int t)
    {
      if(m==2&&t==0)return 1;
      else return 0;
    }
    int DP(int k,int p,int t)
    {
        if(k==0&&p)return f[k][p][t]=inf;
        if(f[k][p][t]>=0)return f[k][p][t];
        if(k==0&&p==0)return 0;
        int r=inf;
        for(int i=0;i<=p;i++)
          {
              int s1=p-i,s2=i;
              r=min(r,DP(lc[k],s1,0)+DP(rc[k],s2,t)+C(t)*dis[k]);
          }
        for(int i=0;i<=p-1;i++)
          {
              int s1=p-i-1,s2=i;
              r=min(r,DP(lc[k],s1,1)+DP(rc[k],s2,t)+t*dis[k]);
          }
        return f[k][p][t]=r;
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&K);
        if(n-K<m-1){printf("-1
    ");return 0;}
        memset(f,-1,sizeof(f));
        int a,b,c;
        for(int i=1;i<n;i++)
          {
              scanf("%d%d%d",&a,&b,&c);
              Add(a,b,c);Add(b,a,c);
          }
        Dfs(1,1);Build();V[1]=1;
        printf("%d
    ",DP(lc[1],K-1,1));
        return 0;
    }
  • 相关阅读:
    剑指offer JZ-1
    侯捷《C++面向对象开发》--String类的实现
    侯捷《C++面向对象开发》--复数类的实现
    辛普森悖论
    马尔可夫链的平稳分布
    熵和基尼指数的一些性质
    UVA 11624 Fire!(广度优先搜索)
    HDU 4578 Transformation (线段树区间多种更新)
    HDU 1540 Tunnel Warfare(线段树+区间合并)
    多重背包
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5781732.html
Copyright © 2011-2022 走看看