题意参考 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;
}