【hdu5534】【2015ACM/ICPC亚洲区长春站】Partial Tree 题意&题解&代码
2016-04-21 14:54
281 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5534
题意:
构造一棵有n个节点的数,f[i]表示度数(入度+出度)为i的节点的点权,给出所有的f[i],问这棵树最大点权。
题解:
一道dp题,思维很巧妙
一共有n个点则总度数为2×(n-1),首先每个点至少也要一度则将这确定的一度先分配到每个点上,接下来还剩下n-2度没有分配,因为度数是任意分配的,接下来我们可以把问题看做将n-2度分配任意多个n-2度,n-3度,n-4度…………1度使得分配完后权值最大,这样看来,这不就是个完全背包么,果然我dp学的还是差。
代码:
http://acm.hdu.edu.cn/showproblem.php?pid=5534
题意:
构造一棵有n个节点的数,f[i]表示度数(入度+出度)为i的节点的点权,给出所有的f[i],问这棵树最大点权。
题解:
一道dp题,思维很巧妙
一共有n个点则总度数为2×(n-1),首先每个点至少也要一度则将这确定的一度先分配到每个点上,接下来还剩下n-2度没有分配,因为度数是任意分配的,接下来我们可以把问题看做将n-2度分配任意多个n-2度,n-3度,n-4度…………1度使得分配完后权值最大,这样看来,这不就是个完全背包么,果然我dp学的还是差。
代码:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; int n,T,f[2020],dp[4050]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for (int i=1;i<n;i++) { scanf("%d",&f[i]); dp[i]=-1; } dp[0]=f[1]*n; int now=f[1]; for (int i=1;i<n;i++) f[i]=f[i]-now; for (int i=1;i<n;i++) { for (int j=0;j<=n-2;j++) if (j-i>=0) dp[j]=max(dp[j],dp[j-i]+f[i+1]); } cout<<dp[n-2]<<endl; } }
相关文章推荐
- Java动态代理一——动态类Proxy的使用
- 报错:java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
- 基于标记的ID检测opencv实现代码
- 谈C#中的Delegate
- Python学习(21)python操作mysql数据库_操作
- C语言中Union类型的使用方法
- SpringMVC一例 是否需要重定向
- 同是流行MVC框架,比较Strtus2和SpringMVC的区别
- RESTful架构---结合spring MVC 4
- C#基础知识之使用字典
- 求一个整数的二进制数中1的个数
- 关于php中json_encode中文乱码问题
- java中的运算
- java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.SimpleTriggerBea
- 【Java】须要配置的三个Java环境变量
- php分享(三十六)mysql中关联表更新
- Java "for" 的遍历方式
- Spring中depends-on的作用是什么?
- Java 读取Ftp文件大小
- 报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config