UVALive 5741 Wealthy Family

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVALive 5741 Wealthy Family相关的知识,希望对你有一定的参考价值。

树形背包。DP递推的思路很简单....

但是由于节点有15万个,先不论空间复杂度,这样开dp数组 dp[150000+10][300+10],如果初始化是memset(dp,-1,sizeof dp),则必然超时。

所以需要一个状态数剪枝。。。即记录这个节点最多组合的数量。

UVALive是不限制内存的,所以dp[150000+10][300+10] 能够AC,HDU 4169 限制了内存大小,需要优化空间复杂度。。。还在思考。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n, k;
int root;
const int maxn = 150000 + 10;
struct Edge
{
    int now;
    int next;
}e[maxn];
int head[maxn];
int cnt[maxn];
int val[maxn];
int dp[maxn][300 + 10];
int q;

void init()
{
    q=0;
    for(int i=1;i<=n;i++) head[i]=-1;
}

void read()
{
    for (int i = 1; i <= n; i++)
    {
        int fa;
        scanf("%d%d", &fa, &val[i]);
        if (!fa) root = i;
        else
        {
            e[q].now=i, e[q].next=head[fa];
            head[fa]=q, q=q+1;
        }
    }
}

void dfs(int now)
{
    cnt[now]=0;
    if (head[now]==-1)
    {
        cnt[now]=1;
        dp[now][1] = val[now];
        return;
    }

    for (int i = head[now]; i!=-1; i=e[i].next)
    {
        int id = e[i].now;
        dfs(id);
        cnt[now]=cnt[now]+cnt[id];
    }

    cnt[now]=min(cnt[now],k);

     for(int i=0;i<=cnt[now];i++) dp[now][i]=-1;
        dp[now][0]=0;

    for (int i = head[now]; i!=-1; i=e[i].next)
    {
        int id = e[i].now;
        for(int j=cnt[now];j>=0;j--)
            for(int s=0;s<=j&&s<=cnt[id];s++)
                if(dp[id][s]!=-1&&dp[now][j-s]!=-1)
                    dp[now][j]=max(dp[now][j],dp[id][s]+dp[now][j-s]);
    }
    dp[now][1]=max(val[now],dp[now][1]);
}

void work()
{
    dfs(root);
    if (cnt[root]<k||dp[root][k] == -1) printf("impossible\n");
    else printf("%d\n", dp[root][k]);
}

int main()
{
    while (~scanf("%d%d", &n, &k))
    {
        init();
        read();
        work();
    }
    return 0;
}

 

以上是关于UVALive 5741 Wealthy Family的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 5741 Helter Skelter 扫描线 + 树状数组

P5741 深基7.例10旗鼓相当的对手 - 加强版

学外语

TSQL Round() 不一致?

[2016-03-05][UVALive][4104][MODEX]

UVALive 3989 Ladies&#39; Choice