• BZOJ 4033: [HAOI2015]树上染色


    题解:看着题目感到恐惧,什么一个点选黑选白要是1e5我肯定会往淀粉质想了,就很害怕,我又不会。。然后一看数据范围2000,于是突然开心,想写题。N…N^2应该美滋滋?dp[x][k]表示x的子树中选择k个黑点。然后就常规树形背包一搞?一过样例,交了,WA??我写法错了??蜜汁memset,改了改成了TLE。。一看这题的AC率,一定是新加的数据造成的。发现也没什么用,于是开始自闭,这个方程怎么越看越觉得想N^3呢,内心一阵卧槽,一向不会算复杂的我,于是开始思考,怎么就变大了,这背包就是这么写的呀。然后找了加数据后的题解,然后就惊了,,这不是也是N^3怎么他就飞快了。。。哦原来是这样,相当于在做背包时,是在枚举两颗不同子树中的点(或者说已经dfs完的那些点和当前这颗子树),出现在LCA处,也就是每一对点都只在LCA处被计算一次,那么就稳的N^2了,哇,原来复杂度是这么算的啊。dp太美丽了!!!

    #include<bits/stdc++.h>
    #define ll long long 
    using namespace std;
    const int maxn=2005;
    const ll inf=1e18;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    ll dp[maxn][maxn];
    int n,k;
    int fir[maxn*2],nxt[maxn*2],to[maxn*2];
    ll val[maxn*2];
    int cnt=0,tot;
    int siz[maxn*2];
     
    void add_e(int x,int y,ll tt)
    {
        ++cnt;nxt[cnt]=fir[x];fir[x]=cnt;to[cnt]=y;val[cnt]=tt;
    }
    void dfs1(int x,int fa)
    {
        siz[x]=1;
        dp[x][0]=dp[x][1]=0;
        for(int i=2;i<=k;i++)dp[x][i]=-inf;
        for(int i=fir[x];i;i=nxt[i])
        {
            int v=to[i];
            if(v==fa)continue;
            dfs1(v,x);
            for(int j=min(siz[x],k);j>=0;j--)
            {
                for(int e=min(siz[v],k-j);e>=0;e--)
                {
                    ll ans=val[i]*(e)*(k-e);
                    ll ans1=val[i]*(siz[v]-e)*(n-k-siz[v]+e);
                    dp[x][j+e]=max(dp[x][j+e],dp[x][j]+dp[v][e]+ans+ans1);
                }
            }
            siz[x]+=siz[v];
        }
    }
    int main()
    {
        n=read();k=read();
        int p,q;
        ll tmp;
        //memset(dp,,sizeof(dp));
        for(int i=1;i<n;i++)
        {
            p=read();q=read();
            tmp=read();
            add_e(p,q,tmp);
            add_e(q,p,tmp);
        }
        dfs1(1,0);
        cout<<dp[1][k]<<"
    ";
    }
    

      

  • 相关阅读:
    stm32之watchdog
    stm32之PWM
    stm32之GPIO(二)
    JavaScript之怎样获取元素节点
    JavaScript之对象学习
    JavaScript之数组学习
    Jquery遍历数组之$.inArray()方法介绍
    Jquery 遍历数组之$().each方法与$.each()方法介绍
    C# 移位运算符
    tensorboard简单使用
  • 原文地址:https://www.cnblogs.com/intwentieth/p/9840521.html
Copyright © 2020-2023  润新知