题目


Pearls的替代必须是连续的,否则会有更优策略,这不难证明。定义状态dp[i]表示在已知第i类珍珠时,所需支付的最低价格
则状态方程为:
dp[i]=(a[i]+10)*p[i]+dp[i-1] //当第i种珍珠出现时,未优化价格的情况
dp[i]=min((sum[i]-sum[j]+10)*p[i]+dp[j]) //枚举j,价格优化
dp[i]=min(dp[j]-sum[j] *p[i]) + sum[i]*p[i]+10*p[i]
dp[j] – dp[k] < p[i]*(sum[j] – sum[k])
斜率优化。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define N 110
#define cls(a) memset(a,0,sizeof(a))
struct P{int x, y;
};P q[1000];
int dp[N], a[N], sum[N], p[N], n, l, r;P operator - ( P a, P b ){P p;p.x = a.x - b.x;p.y = a.y - b.y;return p;
}int operator * ( P a, P b ){return a.x*b.y - a.y*b.x;
}void init(){//cls(dp), cls(a), cls(sum), cls(p), cls(q);scanf( "%d", &n);for ( int i = 1; i <= n; i++) scanf( "%d%d", &a[i], &p[i]);for ( int i = 1; i <= n; i++) sum[i] = sum[i-1] + a[i];l=1, r=2;dp[0]=0, dp[1] = sum[1]*p[1] + ( sum[1]+10 )*p[1];q[1].x=sum[1], q[1].y=dp[1];
}void insert(int x, int y ){P p;p.x = x, p.y = y;for(;l<r && (p-q[r-1])*(q[r]-q[r-1])>=0;r--);q[++r] = p;
}void Dp(){for ( int i = 1; i <= n; i++){int k = p[i];for (;l<r && q[l].y-k*q[l].x > q[l+1].y-k*q[l+1].x;l++);dp[i] = q[l].y - k*q[l].x + (sum[i]+10)*p[i];insert(sum[i], dp[i]);}printf( "%d\n", dp[n]);
}int main(){int T;scanf( "%d", &T);while ( T-- ){init();Dp();}return 0;
}
/*
2
2
100 1
100 2
3
1 10
1 11
100 12*/

poj-1260 Pearls相关推荐

  1. POJ 1260 Pearls(DP)

    题目链接 无语的一个题.做法是普通的O(n^2)的DP,这个题啥意思啊. 1 #include <cstring> 2 #include <cstdio> 3 #include ...

  2. POJ 1260 Pearls

    题意:给你n种珍珠,档次从低到高. 每一种珍珠会给你计划要买的数量及单位价格.要你求出买原固定数量的珍珠.使得档次与价格最优.(每一个档次的珍珠花的钱=(计划数量+10)*单位价格) 我们来看一个样例 ...

  3. Pearls POJ - 1260(区间记忆化搜索)

    题意: n件物品,给出数量和价格,(注意数量和价格都是升序给出的这个是能DP的关键),要买掉所以商品 对于每类物品,所需要的价格是(a[i]+10)*p[i] ,即要多买10件,也可以把价格低的物品合 ...

  4. poj 1260 动态规划

    题意:给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠. 规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p,输入的价格递增 ...

  5. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  6. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  7. dp进阶之FFT加速+数据结构优化+不等式优化

    快速傅里叶变换 快速傅里叶变换(英语:Fast Fourier Transform, FFT),是快速计算序列的离散傅里叶变换(DFT)或其逆变换的方法.傅里叶分析将信号从原始域(通常是时间或空间)转 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  10. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

最新文章

  1. linux传文件到xp,Linux与Windows XP之间使用FTP互传文件
  2. pip 安装指定版本
  3. iOS12系统应用开发基础教程发送邮件
  4. AjaxPro新发现-错误处理
  5. c语言 个位,如何才能给C语言增加几个位操作函数
  6. python慕课笔记_MOOC python笔记(三) 序列容器:字符串、列表、元组
  7. Photopile JS – 帮助你实现精致的照片堆叠效果
  8. linux x11 挖矿病毒,应急响应:记一次花样贼多的挖矿病毒
  9. ue4 classuobject没有成员beginplay_UE4异步编程专题 - TFunction
  10. (1)-(Two SUM-在数组中找到两个数,他们的和为给定的数)-(数组遍历)
  11. 虚拟服务器软件,VMware ESXi(服务器虚拟化软件) V7.0 官方版
  12. 如何用DETR(detection transformer)训练自己的数据集
  13. 计算机系十周年聚会邀请函,十周年同学聚会邀请函
  14. Delphi 金额转大写
  15. oracle 删掉同义词,【oracle删除同义词】作文写作问答 - 归教作文网
  16. python求反余弦_余弦相似度计算公式:python代码找出相似文章
  17. matlab 更换坐标轴_科学网—【Matlab】坐标轴的设置 - 叶瑞杰的博文
  18. 华为路由器路由表解析
  19. 【Android高级】查看手机及应用内存状况的方法
  20. BeanFactory接口

热门文章

  1. BATT入局,小程序成超级APP连接一切的枢纽
  2. CSS DIV 折角的代码
  3. R查看和更改工作路径的命令
  4. 拍摄视频,真的帧率越高越好吗?
  5. 阿里云 OSS图片处理
  6. 如何把“春节”这个主题写成万用的申论范文
  7. 落户杭州难不难!入户杭州超全办理细则来了!想落户杭州的赶紧看
  8. android中pdf转换成图片格式,Android-PDF转图片
  9. 世界上第一部智能手机27岁了
  10. sip 软电话 java源码,完美的 SIP 软电话