• 2015ICPC chanchun HDU 5534 (树形题转换完全背包)


    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5534

    题意:给你n个点,让你加上n-1条边使他变成一棵树,题目首先给你a[1] a[2].....a[n-1]代表度数为多少时的值,然后问你最大值是多少,n-1条边变成一棵树

    思路:这个题首先限制了只能用n^2以下的算法,我们看这个题首先给的东西都是与度数有关,我们建造一棵树度数总和肯定是2*(n-1)

    我们其实只要把这个度数当作钱,然后购买相应的商品就可以了,但是你可能买相同的边,有些点你就会没买到造成不是一棵树

    这个时候我们就有一个前提,保证是一颗树,那么我们怎么弄呢,我们先保证每个点度数初值为1,所以我们还能用的度数就变成了n-2,然后初值设为n*a[1];

    我们推导式因为我们初度数为1,所以我们要添加i度的时候,我们应该删掉原来的度数1然后再加上i+1的度数值

    即:f[j]=max(f[j],f[j-i]+a[i+1]-a[1]);

    #include<bits/stdc++.h>
    #define mod 1000000007
    #define maxn 100005
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    ll n;
    ll f[maxn],d[maxn],a[maxn];
    int main(){
        int t;
        scanf("%d",&t);
        for(int k=0;k<t;k++){
            cin>>n;
            for(int i=1;i<=n-1;i++) cin>>a[i];
            memset(f,0,sizeof(f));
            f[0]=n*a[1];
            for(int i=2;i<=n-1;i++){
                for(int j=i-1;j<=n-2;j++){
                    f[j]=max(f[j],f[j-i+1]+a[i]-a[1]);
                }
            }
            printf("%lld
    ",f[n-2]);
        }
    } 
  • 相关阅读:
    原型设计作业
    案例分析作业
    编程作业
    阅读任务
    自我介绍
    5 20210420-1 团队作业1—团队展示
    3 20210405-1 案例分析作业
    阅读任务
    自我介绍
    原型设计
  • 原文地址:https://www.cnblogs.com/Lis-/p/10943492.html
Copyright © 2020-2023  润新知