HDU5697 刷题计划 dp+最小乘积生成树
分析:就是不断递归寻找靠近边界的最优解
学习博客(必须先看这个):
1:http://www.cnblogs.com/autsky-jadek/p/3959446.html
2:http://blog.csdn.net/u013849646/article/details/51524748
注:这里用的最小乘积生成树的思想,和dp结合
每次找满足条件的最优的点,只不过BZOJ裸题的满足条件是形成一棵树
这个题是大于m,生成树借用最小生成树进行求解最优,大于m用dp进行求解最优
#include <stdio.h> #include <algorithm> using namespace std; const int N = 8e2+5; typedef long long LL; struct point{int x, y;point(int x=0,int y=0):x(x),y(y){}point operator -(const point &rhs)const{return point(x-rhs.x,y-rhs.y);}point operator +(const point &rhs)const{return point(x+rhs.x,y+rhs.y);} }; LL cross(point a,point b){return 1ll*a.x*b.y-1ll*a.y*b.x; } int n,m,sum; int a[N],b[N],c[N]; point p[N]; LL dp[N],f[N],ans; point get(){p[0]=point(0,0),dp[0]=0;for(int i=1;i<=sum;++i)dp[i]=1LL<<60;for(int i=1;i<=n;++i){for(int j=sum;j>=a[i];--j){if(dp[j]>dp[j-a[i]]+f[i]){dp[j]=dp[j-a[i]]+f[i];p[j]=p[j-a[i]]+point(b[i],c[i]); }}}int ret=m;LL tot=1LL*p[ret].x*p[ret].y;for(int i=m+1;i<=sum;++i){if(dp[i]<dp[ret]||dp[i]==dp[ret]&&1ll*p[i].x*p[i].y<tot)ret=i,tot=1ll*p[i].x*p[i].y;}ans=min(ans,tot);return p[ret]; } void solve(point A,point B){for(int i=1;i<=n;++i)f[i]=1ll*c[i]*(B.x-A.x)+1ll*b[i]*(A.y-B.y);point C=get();if(cross(B-A,C-A)>=0)return;solve(A,C);solve(C,B); } int main(){while(~scanf("%d%d",&n,&m)){sum=0;for(int i=1;i<=n;++i){scanf("%d%d%d",&a[i],&b[i],&c[i]);sum+=a[i];}ans=1LL<<60;for(int i=1;i<=n;++i)f[i]=b[i];point A=get();for(int i=1;i<=n;++i)f[i]=c[i];point B=get();solve(A,B);printf("%I64d\n",ans);}return 0; }
View Code
转载于:https://www.cnblogs.com/shuguangzw/p/5634463.html
HDU5697 刷题计划 dp+最小乘积生成树相关推荐
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2135 是 hydro 的 BZOJ ...
- LeetCode LCP 12. 小张刷题计划(二分查找)
1. 题目 为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0 到 n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注 ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- 北邮oj题库刷题计划(更新ing)
北邮oj题库刷题计划(更新ing) 83. A + B Problem 84 Single Number 85. Three Points On A Line 120 日期 121 最值问题 122 ...
- 力扣动态规划入门21天刷题计划(共计46题)
刷题地址:https://leetcode-cn.com/study-plan/dynamic-programming/?progress=8e97f6 动态规划常常适用于有重叠子问题和最优子结构性质 ...
- 最小乘积生成树和最小乘积最大匹配
两个知识的本质是一样的.都是每条边有k个权值(一般k为2),现在要取一个边集M使得其将所有点连通,并使每一种边权的总和的乘积最小.不同的是一个是生成树一个是匹配. 对于这一类问题,我们都可以把每种方案 ...
- P1926 小书童——刷题大军(dp背包(01背包)状态转移方程)
题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人. 文言是火,点亮历史宫灯:历史是灯,照亮社会之路:社会是路,通向哲学大坑:哲学是坑,埋葬文科生 ...
- 关于leetcode刷题计划
1.简单题目一天2-3: 2.中等题目一天1-2,: 3.困难题目一天1: ~~~每天刷题数目2-3,并写好总结,题目按tags分类,要cover到每个tag: ~~~每周抽1小时回顾一周得题目: ~ ...
最新文章
- 绝望,上传文件失败。。遇到并解决java.lang.NullPointerException
- Java中的Split方法不适用于一个句号
- zookeeper + kafka集群搭建详解
- linux ubuntu ssh,Linux(Ubuntu)安装ssh服务
- mysql cluster双机_GitHub - sophys/mysqlha: 博客“Mysql-cluster数据库集群双机HA研究”测试代码...
- 基于Python的开源人脸识别库,离线识别率高达99.38%
- mysqlreport
- mysql过滤效率和java过滤效率_熔喷布过滤效率测试仪详解
- ajax获取后生成元素,获取动态的子元素生成的内容与jQuery AJAX
- 基于JAVA+SpringMVC+Mybatis+MYSQL的线上电器商城
- sigaction介绍
- 零基础安装Ubuntu kylin 16.04 LTS 后应该做什么[本人安装目的:学习Python数据分析]
- 移动端布局:视口viewport的理解
- 关于前端学习和笔试面试的总结
- matlab机器人画圆轨迹规划
- 3D resnet根据UCF101数据集制作自己的数据集实现动作识别
- c++病毒代码(附源码)
- linux51单片机烧录程序,单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境...
- Incorrect string value: '\xF0\x9F\x98\x82' for column '' at row 1
- 在mips64架构的国产系统中安装pyinstaller