poj1260 pearls

2024-06-17 03:48
文章标签 pearls poj1260

本文主要是介绍poj1260 pearls,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明出处:優YoU  http://user.qzone.qq.com/289065406/blog/1300164274

大致题意:

给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。

【规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p】

 

例如样例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元

 

而对于样例Input的第一个例子:

2

100 1

100 2

按常规支付为 (100+10)*1 + (100+10)*2 =330元

但是全部按第二类珍珠的价格支付,同样买200个,虽然总体质量提升了,但是价格也提高了: (202+10)*2=424元

 

本题关键点在于:

(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,价格优化

 

dp[0]=0;  //Dp初始化

//Memory Time 
//220K   0MS #include<iostream>
using namespace std;int min(int a,int b)
{return a<b?a:b;
}int main(int i,int j)
{int test;cin>>test;while(test--){/*Input & Initial*/int c;cin>>c;int* a=new int[c+1];  //某类珍珠数目int* p=new int[c+1];  //某类珍珠单价int* dp=new int[c+1]; //dp[i]表示在已知第i类珍珠时,所需支付的最低价格int* sum=new int[c+1];//sum[i]=∑a[i]sum[0]=0;for(i=1;i<=c;i++){cin>>a[i]>>p[i];sum[i]=sum[i-1]+a[i];}/*Dp*/dp[0]=0;  //Dp初始化for(i=1;i<=c;i++){dp[i]=(a[i]+10)*p[i]+dp[i-1];   //当第i种珍珠出现时,未优化价格的情况for(j=0;j<i;j++)  //枚举第i种珍珠前的每一种珍珠,寻找最优价格dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]);  //在求dp[i]前,对于每一个j<i,dp[j]的最优值已求出}                                                        //(sum[i]-sum[j]+10)*p[i]即第j+1~i种珍珠被第i种珍珠替代后的价格cout<<dp[c]<<endl;delete a,p,dp,sum;}return 0;
}


这篇关于poj1260 pearls的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068407

相关文章

HDU 5009 Paint Pearls(西安网络赛C题)

HDU 5009 Paint Pearls 题目链接 题意:给定一个目标颜色,每次能选一个区间染色,染色的代价为这个区间不同颜色数的平方,问最小代价 思路:先预处理,把相同颜色的一段合并成一个点,然后把颜色离散化掉,然后进行dp,dp[i]表示染到第i个位置的代价,然后往后转移,转移的过程记录下不同个数,这样就可以转移了,注意加个剪枝,就是如果答案大于了dp[n]就不用往后继续转移了

poj1260

【题目描述】 现在要买若干种价值的珍珠,但买某种珍珠必须多付10颗此种珍珠的价钱,一颗珍珠可以用比它贵的珍珠充数,因此有时候用贵的珍珠来代替便宜的可能更省钱,输入要买的若干种珍珠,在可用高价珍珠充数的条件下,问最少需要花费多少钱. 思路:经典的动规,是矩阵链乘的变形。设sum[i][j]为第i到第j种珍珠的最少花费,求出sum[i][k]+sum[k+1][j](i<=k<j)的最小值,再算出

hdu 1300 Pearls(DP)

题目链接 /* 就这道题而言;如果不用优化那么他是时间复杂度是 (O(n*n)) dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]) 如果 有 k<j<i使得 dp[k]+(sum[i]-sum[k]+10)*p[i]>dp[j]+(sum[i]-sum[j]+10)*p[i];化简 dp[k]-dp[j]>(sum[k]-sum[

阅读《Programming Pearls second Edition》后的一些总结和个人实践的套用

以下内容是我阅读《Programming Pearls second Edition》后的一些总结和个人实践的套用。1、程序员的主要问题不一定是技术上的,更可能是心理上的:因为他正试图解决一个错误的问题,所以他不能取得进步。通过打破概念上的障碍,转而解决一个更简单的问题,这样我们最终解决了问题。2、"问题越一般话,解决起来可能也就越容易",对于编程来说,这就意味着直接解决一个23种情况的问题,要比

poj-1260-Pearls-dp

这道题目我真是无力吐槽了。,, 题意: 从质量差到质量好的顺序给你需要买的珍珠的数量和单价。 让你求如何花最少的钱买到所有的珍珠(质量差的可以用质量好的来替换); 买一种单价为p的珍珠n个花费(n+10)*p;即每种珍珠需要多花10*p的钱。 做法: 用dp【i】表示买到第i种珍珠花的钱。 则:dp【i】=min(dp【i】,dp[j]+(sum[i]-sum[j]+10)*p[i])

【校内互测】Rivendell’s pearls(字符串哈希+容斥)

Rivendell’s pearls(pearls.cpp) 【问题描述】     Rivendell 是一个心灵手巧的男孩子,他在闲暇的时候喜欢做一些小饰品。有一天 Rivendell用漂亮的珍珠做成了 n串手链,并且每串手链都由 4个珍珠构成,并且每粒珍珠都有一种颜色,颜色用小写字母和数字表示。现在他突然想知道这n 串手链中有多少对有且仅有k 粒珍珠是不同颜色的。 【输入格式】