poj-1260 -Pearls-DP

题意参考  http://blog.sina.com.cn/s/blog_6635898a0100i381.html
题意:有c个种品质不同的Pearls,若要买某一品质的Pearl必须在你买的数量的基础上,多付10个这种Pearl的价钱,可以用高品质的Pearl代替低品质的(通过将少购买的种类来节约多支付的10个的价钱)。求要买到所有目标Pearls至少要花多少钱。

dp[i]表示  前i种物品 得到的 最优化价格
sum[i] 表示前i种物品数量之和(前缀和)




对于dp[i]我们假设优化 j<i的一些物品的价格,使得p[i]*num[j]<(num[j]+10)*p[j]


那么假设带*的是被优化的(即用p[i]买)  即存在 * * * * X * * i 
显然 X表示 其价格没被i优化,而 x<j<i之间 都是用价格i购买的,不可能给X带来价格优化,也就是 X是用p[x]购买的,既然如此,j<x的物品j,通通都不该用 p[i]买,而是应该用 p[x]买,这会让价格更节约。。。。。
因此结论就是 :   如果原价购买物品i,如果可以对其前面的物品进行价格优化,优化区间必然是连续的。。。
于是
dp[i]=inf
dp[i]=min(dp[i], dp[j]+ (sum[i]-sum[j])*p[i] ); 




#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
int min(int a,int b)
{
	return a>b?b:a;
}
int inf=2147483647;
double eps=0.000001;  
int sum [1005];
int num[1005],p[1005],dp[1005];
int main()
{
	int t;cin>>t;
	while(t--)
	{ 
		int n,i,k,j;
		cin>>n;
		for ( i=1;i<=n;i++)
		{
			scanf("%d %d",&num[i],&p[i]);
			sum[i]=sum[i-1]+num[i];
		
		} 

			for (i=1;i<=n;i++)
			{	
				dp[i]=inf;
				for (j=0;j<i;j++)
				{
				dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*(p[i]));
				}
			}
	 
		printf("%d\n",dp[n]); 
	}
	return 0;
}


你可能感兴趣的:(poj-1260 -Pearls-DP)