Problem Description
In Pearlania everybody is fond of pearls. One company, called The Royal Pearl, produces a lot of jewelry with pearls in it. The Royal Pearl has its name because it delivers to the royal family of Pearlania. But it also produces bracelets and necklaces for ordinary people. Of course the quality of the pearls for these people is much lower then the quality of pearls for the royal family. In Pearlania pearls are separated into 100 different quality classes. A quality class is identified by the price for one single pearl in that quality class. This price is unique for that quality class and the price is always higher then the price for a pearl in a lower quality class.

Every month the stock manager
of The Royal Pearl prepares a list with the number of pearls needed in
each quality class. The pearls are bought on the local pearl market.
Each quality class has its own price per pearl, but for every complete
deal in a certain quality class one has to pay an extra amount of money
equal to ten pearls in that class. This is to prevent tourists from
buying just one pearl.

Also The Royal Pearl is suffering from the
slow-down of the global economy. Therefore the company needs to be more
efficient. The CFO (chief financial officer) has discovered that he can
sometimes save money by buying pearls in a higher quality class than is
actually needed. No customer will blame The Royal Pearl for putting
better pearls in the bracelets, as long as the prices remain the same.

For
example 5 pearls are needed in the 10 Euro category and 100 pearls are
needed in the 20 Euro category. That will normally cost: (5+10)*10 +
(100+10)*20 = 2350 Euro.

Buying all 105 pearls in the 20 Euro category only costs: (5+100+10)*20 = 2300 Euro.

The
problem is that it requires a lot of computing work before the CFO
knows how many pearls can best be bought in a higher quality class. You
are asked to help The Royal Pearl with a computer program.

Given a
list with the number of pearls and the price per pearl in different
quality classes, give the lowest possible price needed to buy everything
on the list. Pearls can be bought in the requested, or in a higher
quality class, but not in a lower one.

 
Input
The
first line of the input contains the number of test cases. Each test
case starts with a line containing the number of categories c (1 <= c
<= 100). Then, c lines follow, each with two numbers ai and pi. The
first of these numbers is the number of pearls ai needed in a class (1
<= ai <= 1000). The second number is the price per pearl pi in
that class (1 <= pi <= 1000). The qualities of the classes (and so
the prices) are given in ascending order. All numbers in the input are
integers.
 
Output
For each test case a single line containing a single number: the lowest possible price needed to buy everything on the list.
 
Sample Input
2
2
100 1
100 2
3
1 10
1 11
100 12
 
Sample Output
330 1344

思路:
之前想了一种思路被验证是想偏了,后来看了正确的答案后发现和HDU的2059龟兔赛跑是同一类型的题目
这俩题耽误了能有两天的时间,不过也算让我对DP的认识又上了一个台阶,因为他们都反映了DP的本质:一个状态的最优值是通过枚举所有能够到达这个状态的状态的值所得到的,知道了这点后,再就具体问题具体分析就OK
下面有两段代码,前一段是是按照之前的思路做的,自己和AC的代码比对了很多组数据(故意挑了一些比较刁钻的数据)结果都是相同的,但不知道为什么还是WA,先放在这儿等以后有能力了再来解决,后面的那段代码就是AC的了。

 解法一:(WA但数据测试正确)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int T;
int number;
struct P{
__int64 v;
__int64 c;
}pearl[];
int exits[];
__int64 sum; int main()
{
scanf("%d",&T);
while(T--)
{
sum = ;
scanf("%d",&number);
for(int i = ;i <= number;i++){
scanf("%I64d%I64d",&pearl[i].c,&pearl[i].v);
exits[i] = ;
}
for(int i = ;i <= number;i++)
if(pearl[i-].c*pearl[i].v < (pearl[i-].c+)*pearl[i-].v){
pearl[i].c += pearl[i-].c;
exits[i-] = ;
}
for(int i = ;i <= number;i++)
if(exits[i]) sum += (pearl[i].c+)*pearl[i].v;
printf("%I64d\n",sum);
}
return ;
}

解法二(AC):

#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x7fffffff
using namespace std; int min(int a,int b)
{
return a<b?a:b;
} int main()
{
int T;
int sum[];
int val[];
int dp[];
int num[];
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
sum[] = ;
for(int i = ;i <= n;i++) {
scanf("%d%d",&num[i],&val[i]);
sum[i] = sum[i-]+num[i];
}
for(int i = ;i <= n;i++)
dp[i] = INF;
sum[] = ;
dp[] = ;
for(int i = ;i <= n;i++)
for(int j = ;j < i;j++)
dp[i] = min(dp[i],dp[j]+(sum[i]-sum[j]+)*val[i]);
printf("%d\n",dp[n]);
}
return ;
}

HDU-1300(基础方程DP-遍历之前所有状态)的更多相关文章

  1. HDU 1300 Pearls (DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 题目大意:珠宝店有100种不同质量的珍珠,质量越高价钱越高,为了促进销售,每买一种类型的珍珠,要 ...

  2. hdu 1300 Pearls(dp)

    Pearls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. HDU-1176(基础方程DP)

    Problem Description 都 说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉, 就掉落在他 ...

  4. D - Pearls HDU - 1300 斜率dp+二分

    D - Pearls HDU - 1300 这个题目也是一个比较裸的斜率dp,依照之前可以推一下这个公式,这个很好推 这个注意题目已经按照价格升序排列序,所以还是前缀和还是单调的. sum[i] 表示 ...

  5. hdu 1300 Pearls

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 思路:用dp[i]表示前i种花费最低的情况,则有dp[i]=min(dp[i],dp[j+1]+(( ...

  6. HDU 6321 (状压dp)

    题目大意:: 为给你n个点(n<=10,nn<=10,n) 初始时没有边相连 然后有m个操作(m<=30000m<=30000) 每次可以添加一条边或删除一条边 允许有重边 要 ...

  7. 基础树形DP小结

    HDU 4044 Geodefense http://blog.csdn.net/zmx354/article/details/25109897 树形DP暂且先告一段落了. HDU 3586 Info ...

  8. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  9. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Oracle数据库学习 视图、序列及存储过程

    视图(View) 视图也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示. 视图对应一个select语句,结果集被赋予一个名字,也就是视图的名字. 视图本身不包含任何数据,它只是包含映射到基表的一个查 ...

  2. linux启动黑屏或无法进入会话管理器

    原因是因为更新软件时删除了/etc中的xserver配置文件,进入livecd将相关文件拷贝即可

  3. Ubuntu常用终端快捷键

    CTRL+k:删除从光标到行尾的部分 CTRL+u:删除从光标到行首的部分 ALT+d:删除从光标到当前单词结尾的部分 CTRL+w:删除从光标到当前单词开头的部分 CTRL+a:将光标移到行首 CT ...

  4. 关于Java IM的一点资料

    微信是腾讯采用自己开发的协议做的,其他市面上很多产品大都是采用XMPP协议,包括米聊在内之前也是这样子. 采用XMPP协议,服务端可以采用OpenFire搭建,客户端有个开源的叫asmack的东西,g ...

  5. LVS 介绍以及配置应用

    1.负载均衡集群介绍 1.1.什么是负载均衡集群 负载均衡集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据的处理能力.提高网络的灵活性和可用性 搭建负 ...

  6. 第一天的CI笔记

    1 CI不区分大小写2. http://xxx.com/index/[控制器名称]/[控制器里面方法的确名称]/[传入方法的参数 ]/ 3. 控制器及控制器类名称与文件名称一致, 继承 CI_Cont ...

  7. js 删除数组方法

    今天遇到一个比较脑残的问题 ,在在用js删除数组的时候 delete 数组[下标]的方法删除数组时,该数组的下标变为null,但是数组的长度并没有发生相应的变化 转而使用splice(小标,第N个)删 ...

  8. HIVE:用外连接替代子查询

    由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支 ...

  9. 从一个模板函数聊聊模板函数里面如何获得T的名字

    写了个小程序,遇到点问题.总结总结,学习学习 #include<vector> #include<iostream> #include<typeinfo> usin ...

  10. AVR GCC对端口的操作指南

    1. AVR GCC for AVR I.I/O端口API1. BV用法:BV(pos);说明:将位定义转换成屏蔽码(MASK).与头文件io.h里的位定义一起使用.例如,置位WDTOE和WDE可表示 ...