Partial Tree

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

完全背包

做这题前去学习了下完全背包,觉得这个优化简直神技!(以前都是用01背包做的,数据水的话可以过= =)

 for(int i=;i<=n;++i)
for(int j=i;j<=V;++j)
dp[j]=max(dp[j],dp[j-i]+v[i]);

完全背包 时间复杂度O(VE)

我们回到这道题,显然整棵树的总的度为2n-2,相当于将2n-2个度分配到n个结点中去;

为了保证没有一个结点的度为0,现将每个结点的度预设为1;

于是问题就相当于往容量为n-2的背包中放东西,东西的代价度,权值为f(x),也就是完全背包的变形了。

设状态:dp[j]表示度为i时的最大值

状态转移方程:dp[j]=max(dp[j],dp[j-i]+f[i+1]-f[1])

代码如下:

 #include<cstdio>
#include<cstring>
#define Max(x,y) (x>y?x:y)
#define N 2020
using namespace std;
typedef long long LL;
const LL INF=(LL)1e15;
LL T,n,dp[*N],f[N],lmt,ans;//dp[i]为存放i代价的最大价值
int main(void){
scanf("%I64d",&T);
while(T--){
scanf("%I64d",&n);
lmt=n-;
for(LL i=;i<=lmt;++i)
dp[i]=-INF;
for(LL i=;i<n;++i)
scanf("%I64d",&f[i]);
for(LL i=;i<n-;++i)
for(LL j=i;j<=lmt;++j)
dp[j]=Max(dp[j],dp[j-i]+f[i+]-f[]);
ans=dp[lmt]+n*f[];
printf("%I64d\n",ans);
}
}

最新文章

  1. Java 开发技巧
  2. scp 在Ubuntu下传文件 基于ssh
  3. ♫【MV*】
  4. html转换为纯文本,支持撇号
  5. 两句话动态修改table数据并提交到后台
  6. UNIX网络编程——ioctl 函数的用法详解
  7. 即将发布的 ASP.NET Core 2.2 会有哪些新玩意儿?
  8. Cocos Creator 生命周期回调(官方文档摘录)
  9. window.location各属性的值
  10. luogu P4173 残缺的字符串
  11. SSM框架应用
  12. 各数据库连接maven配置
  13. mysql创建索引以及对索引的理解
  14. JsTree使用一例
  15. SQL Server 2008 数据库回滚到某个时间点
  16. opencv-android笔记1:android studio 2.3 + opencv-android-sdk 实现 camera预览
  17. layer.confirm在ASP.NET控件onclick上面的应用方法
  18. 【C#】反编译C#应用程序
  19. Sdn - 基础题试水
  20. html调用servlet(JDBC在Servlet中的使用)(1)

热门文章

  1. HTTP could not register URL http://+:86/. 设置VS默认以管理员权限打开
  2. CSS align-content 属性
  3. kubernetes1.4 基础篇:Learn Kubernetes 1.4 by 6 steps
  4. 字典(Tire树)
  5. python 数据清洗之字符串处理
  6. SpringMVC @ResponseStatus 的用法
  7. scip学习
  8. OBIEE 缓存机制
  9. react-router的基础知识
  10. Tiny6410之UART裸机驱动