POJ-1260 Pearls---DP
题目链接:
https://cn.vjudge.net/problem/POJ-1260
题目大意:
给定一系列的不同质量项链上的珠宝数量和价格(按质量升序给出,同时价格也升序)。可以用价格高的珠宝来替代价格低的珠宝。这样或许可以节省总钱数。而题目就是要求出购买所有数量的珠宝所需支付的最低价格。
解题思路:
例如样例Input的第二个例子:
3
1 10
1 11
100 12
需要买第一类1个,第二类1个,第三类100个
按常规支付为 (1+10)*10 + (1+10)*11 + (100+10)*12 = 1551元(一共买了102个珍珠)
但是如果全部都按照第三类珍珠的价格支付,同样是买102个,而且其中总体质量还被提高了,但是价格却下降了:(102+10)*12 = 1344元
本题关键点在于:
(1) 要求要买的珍珠的数量是一定的
(2) 所买的珍珠的质量允许提高,但不允许下降(即可以用高质量珍珠替代低质量)
(3) 输入时,后输入的珍珠价格一定比前面输入的要贵
(4) 由(2)(3)知,珍珠的替代必须是连续的,不能跳跃替代(这个不难证明,因为假如用第i+2类去替代第i类珍珠,会使最终的支付价格降低,那么用第i+1类去替代第i类珍珠会使最终的支付价格更加低)
根据这4个约束条件,那么购买珍珠的方案为:
在珍珠类型的总区间[1,c]中划分多个子区间,其中在闭区间i1~j1的珍珠全部按第j1类珍珠的价格p1支付,在闭区间i2~j2的珍珠全部按第j2类珍珠的价格p2支付,…在闭区间in~jn的珍珠全部按第jn类珍珠的价格pn支付。 这些区间互不相交。
其余珍珠按其原价支付。
要求找出最优的划分方案,使得最终支付价格最低。
令dp[i]表示在已知第i类珍珠时,所需支付的最低价格
则状态方程为:
dp[i]=(a[i]+10)*p[i]+dp[i-1]; //当第i种珍珠出现时,未优化价格的情况
dp[i]=min(dp[i],(sum[i]-sum[j]+10)*p[i]+dp[j]); //枚举j,价格优化
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<stack> 8 #include<map> 9 #include<sstream> 10 #define Mem(a, b) memset(a, b, sizeof(a)) 11 using namespace std; 12 typedef long long ll; 13 int dp[1005], sum[1005];//dp[i]表示前i个的最低价格,sum[i]表示前i个的数目 14 int a[1005], p[1005];//输入的数据,分别是个数和价格 15 int main() 16 { 17 int T, n; 18 cin >> T; 19 while(T--) 20 { 21 Mem(a, 0); 22 Mem(p, 0); 23 Mem(dp, 0); 24 Mem(sum, 0); 25 cin >> n; 26 for(int i = 1; i <= n; i++)cin >> a[i] >> p[i], sum[i] = sum[i - 1] + a[i]; 27 for(int i = 1; i <= n; i++) 28 { 29 dp[i] = dp[i - 1] + p[i] * (a[i] + 10); 30 for(int j = 0; j < i; j++) 31 dp[i] = min(dp[i], dp[j] + (sum[i] - sum[j] + 10) * p[i]);//只能有高价格代替低价格 32 } 33 cout<<dp[n]<<endl; 34 } 35 return 0; 36 }
转载于:https://www.cnblogs.com/fzl194/p/9010700.html
POJ-1260 Pearls---DP相关推荐
- POJ 1260 Pearls(DP)
题目链接 无语的一个题.做法是普通的O(n^2)的DP,这个题啥意思啊. 1 #include <cstring> 2 #include <cstdio> 3 #include ...
- POJ 1260 Pearls
题意:给你n种珍珠,档次从低到高. 每一种珍珠会给你计划要买的数量及单位价格.要你求出买原固定数量的珍珠.使得档次与价格最优.(每一个档次的珍珠花的钱=(计划数量+10)*单位价格) 我们来看一个样例 ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- Pearls POJ - 1260(区间记忆化搜索)
题意: n件物品,给出数量和价格,(注意数量和价格都是升序给出的这个是能DP的关键),要买掉所以商品 对于每类物品,所需要的价格是(a[i]+10)*p[i] ,即要多买10件,也可以把价格低的物品合 ...
- POJ-1260 Pearls DP
题目链接:http://poj.org/problem?id=1260 基本DP,只要证明最优解中不会有交叉替换,得出转移方程:f[i]=min{f[j]+(a[j+1]+..+a[i]+10)*p[ ...
- POJ 2096 (概率DP)
题目链接: http://poj.org/problem?id=2096 题目大意:n种bug,s个子系统.每天随机找一个bug,种类随机,来自系统随机.问找齐n种bug,且每个子系统至少有一个bug ...
- POJ 2955 (区间DP)
题目链接: http://poj.org/problem?id=2955 题目大意:括号匹配.对称的括号匹配数量+2.问最大匹配数. 解题思路: 看起来像个区间问题. DP边界:无.区间间隔为0时,默 ...
- 目的地返回POJ 2336 动态规划(DP) Ferry Loading II
在写这篇文章之前,xxx已写过了几篇关于改目的地返回主题的文章,想要了解的朋友可以去翻一下之前的文章 标题链接:http://poj.org/problem?id=2336 分析:想设我们要求的是第i ...
- POJ 2342 (树形DP)
题目链接: http://poj.org/problem?id=2342 题目大意:直属上司和下属出席聚会.下属的上司出现了,下属就不能参加,反之下属参加.注意上司只是指直属的上司.每个人出席的人都有 ...
- POJ 3252 数位DP
链接: http://poj.org/problem?id=3252 题意: 给你一个区间l,r,求区间中有多少个数转化为二进制后1的个数大于等于0的个数 题解: 还是数位dp,不过多了前导0的判断 ...
最新文章
- 综合性深入的技术文章-20161103
- 如何删除输入文本元素上的边框突出显示
- 远程桌面连接mstsc 超扎心
- linux 为开发板添加板级文件config.h
- 彻底解决Git中文乱码问题
- windows下搭建go开发环境
- matlab 旅行商遗传算法,急求蚁群混合遗传算法在matlab上的实现以解决TSP旅行商的问? 爱问知识人...
- Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))
- win7台式电脑怎么连wifi_台式电脑怎么用wifi网络
- 移动设备测试 6 free mobile device emulators for testing your site
- Qt编写echart仪表盘JS交互程序支持webkit和webengine(开源)
- WPF学习之路(二) XAML(续)
- 浅谈DDos******与防御
- 这文字的起始位置_如何用AE快速制造文字特效视频的效果?3分钟教你学会
- 如何对Firefox拓展程序进行修改
- select XX.nextval from dual
- CCNA上机实验_19-PPP
- 免费建立一个自己的网站
- 分享:快捷方便的函数命名网站
- 群晖NAS Git Server项目源代码管理 配置搭建