题目链接:

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相关推荐

  1. POJ 1260 Pearls(DP)

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

  2. POJ 1260 Pearls

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

  3. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

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

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

  5. POJ-1260 Pearls DP

    题目链接:http://poj.org/problem?id=1260 基本DP,只要证明最优解中不会有交叉替换,得出转移方程:f[i]=min{f[j]+(a[j+1]+..+a[i]+10)*p[ ...

  6. POJ 2096 (概率DP)

    题目链接: http://poj.org/problem?id=2096 题目大意:n种bug,s个子系统.每天随机找一个bug,种类随机,来自系统随机.问找齐n种bug,且每个子系统至少有一个bug ...

  7. POJ 2955 (区间DP)

    题目链接: http://poj.org/problem?id=2955 题目大意:括号匹配.对称的括号匹配数量+2.问最大匹配数. 解题思路: 看起来像个区间问题. DP边界:无.区间间隔为0时,默 ...

  8. 目的地返回POJ 2336 动态规划(DP) Ferry Loading II

    在写这篇文章之前,xxx已写过了几篇关于改目的地返回主题的文章,想要了解的朋友可以去翻一下之前的文章 标题链接:http://poj.org/problem?id=2336 分析:想设我们要求的是第i ...

  9. POJ 2342 (树形DP)

    题目链接: http://poj.org/problem?id=2342 题目大意:直属上司和下属出席聚会.下属的上司出现了,下属就不能参加,反之下属参加.注意上司只是指直属的上司.每个人出席的人都有 ...

  10. POJ 3252 数位DP

    链接: http://poj.org/problem?id=3252 题意: 给你一个区间l,r,求区间中有多少个数转化为二进制后1的个数大于等于0的个数 题解: 还是数位dp,不过多了前导0的判断 ...

最新文章

  1. 综合性深入的技术文章-20161103
  2. 如何删除输入文本元素上的边框突出显示
  3. 远程桌面连接mstsc 超扎心
  4. linux 为开发板添加板级文件config.h
  5. 彻底解决Git中文乱码问题
  6. windows下搭建go开发环境
  7. matlab 旅行商遗传算法,急求蚁群混合遗传算法在matlab上的实现以解决TSP旅行商的问? 爱问知识人...
  8. Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))
  9. win7台式电脑怎么连wifi_台式电脑怎么用wifi网络
  10. 移动设备测试 6 free mobile device emulators for testing your site
  11. Qt编写echart仪表盘JS交互程序支持webkit和webengine(开源)
  12. WPF学习之路(二) XAML(续)
  13. 浅谈DDos******与防御
  14. 这文字的起始位置_如何用AE快速制造文字特效视频的效果?3分钟教你学会
  15. 如何对Firefox拓展程序进行修改
  16. select XX.nextval from dual
  17. CCNA上机实验_19-PPP
  18. 免费建立一个自己的网站
  19. 分享:快捷方便的函数命名网站
  20. 群晖NAS Git Server项目源代码管理 配置搭建

热门文章

  1. ufw禁止IP访问ubuntu服务器
  2. Web 安全与 Rational AppScan 入门
  3. Grafana+Zabbix使用配置
  4. 建议重写equals方法时也一并重写hashCode方法
  5. 【小白的CFD之旅】22 好网格与坏网格
  6. mac/unix系统:C++实现一个端口扫描器
  7. 虚拟CentOS访问Windows下共享文件(二)
  8. ubuntu设置PATH
  9. 21种代码的“坏味道”
  10. Golang Web入门(4):如何设计API