pku 3345 problem solving report and thinking
来源:互联网 发布:完美的编程语言 编辑:程序博客网 时间:2024/05/16 07:09
这两天在做pku3345,是一道关于树形dp的题目,和动态的背包问题很相似,不过是对树进行dp,关键是找到dp方程。通过这道题目复习了下动态规划(dynamic programming)
动态规划一般是通过划分问题得到原问题的一系列子问题,通过求和子问题的最优解最后得到原问题的最优解。
如背包问题,对于最优解{y1,y2,y3...yn}取出任意一个值yk,剩下的解依旧是原问题取出yk后的最优解,即具有最优子结构性质。只要求的原问题的子问题的最优解并和并子问题的最优解即可得到原问题的最优解。
对于背包问题,可以设m[i][j]为从物品i-n中选出不操作重量j的物品的最大价值,递归方程为:
m[i][j] = max{m[i+1][j],m[i+1][j-wi]+vi} j>=wi
m[i][j] = m[i+1][j] 0<=j< wi
m[n][j] = vn j >=wn
m[n][j] = 0 0<=j<wn
在写代码是需要进行降序计算,即从n-->1计算m[i][j],原因在于m[i][j]的值依赖于m[i+1][j],所以需先求出m[i+1][j]再求m[i][j]。
关于pku3345这道题目,同样使用的背包问题方法,但是求解的对象是树形的,要在一棵树种选出至少m个节点使得花费最小。动态方程为:
dp[i][j]表示从以i为根的节点下面选择j个节点所花费的最小代价。
dp[i][j] = min{dp[i][j], dp[i][j-k] +dp[son][k]}其中son表示节点i的所有子节点(需要遍历),k表示从以i为根的节点下面选择j个节点中的k个节点从i的子孩子中选择。(k的选择范围是从0-子节点son所控制的所有节点数量)
这边代码中依旧是先计算dp[i][j]在计算dp[i][j-k]原因在于每个子节点都相互独立的,如果先计算dp[i][j-k]则会和其他子节点的结果产生关联。
可能写的太乱了,直接贴代码吧
- pku 3345 problem solving report and thinking
- the thinking and solving of local storage problem
- Thinking in Patterns Problem-Solving Techniques using Java
- Data Abstraction and Problem solving with Java
- RHEL7 USB installation problem and solving
- RHEL7 USB installation problem and solving
- Samba Server possible problem and solving
- Ubuntu desktop installation problem and solving
- Problem Solving
- Practical NoSQL - Solving a Real Problem with MongoDB and Redis
- Problem Solving Techniques
- Large-Scale Problem Solving
- Python : Problem Solving
- POJ 3265 Problem Solving
- poj3265(Problem Solving) dp
- Problem-Solving Strategies
- [POJ3265]Problem Solving
- Problem Solving with algorithms and data structures using Python 翻译计划
- 我的第一个51单片机程序
- SQL2005中row_number()等函数的用法
- Android的Camera架构简介
- 【译文】培养磁性人格的七种方法
- Lagrange插值问题
- pku 3345 problem solving report and thinking
- (笔记)3ds max快捷键
- (笔记)关于3d建模
- (笔记)关于3d建模软件中骨骼动画的一些概念
- (笔记)韩顺平linux(视频0-3)学习笔记
- (笔记)韩顺平linux(视频4-6)学习笔记
- (笔记)韩顺平linux(视频7-8.08)学习笔记
- (笔记)魔兽22总结
- 新知Bak