题目意思是:给出要过买的珠宝的数量和价格,每种珠宝购买时必须要多支付购买的那种珠宝10*单价。然后,采购人员有有一种选择,如果购买单价比要购买的单价更贵的珠宝并且花的钱更少,客户是没有意见的。现在就是找状态转移方程了。就是一种状态转移到当前的状态了,我们知道转移肯定是连续的,因为我们把一种单价的某几个单价珠宝换成价格更贵的是没有任何意义的。因为我们要减少的是哪个10*value,也就是说把某一种珠宝全部换成比他价格更贵种类的珠宝。这个时候就知道,如果前i种珠宝买完之后费用为dp[i]那么直接从这个状态转移到dp[j],要加的费用是从i到j之间的所有珠宝个数全部用j种珠宝的单价购买。那个大?在这中间求最佳。
#include <iostream>
#include <stdlib.h>
#include <cstdio>
#include <algorithm>
#include <memory.h>
#define maxn 105
using namespace std;
struct mystruct
{
int number,value;
}arr[maxn];
int dp[maxn],sum[maxn];
int main()
{
int T,num;
scanf("%d",&T);
while(T--)
{
memset(sum,0,sizeof sum);
scanf("%d",&num);
for(int i=1;i<=num;i++)
{
scanf("%d%d",&arr[i].number,&arr[i].value);
sum[i]=sum[i-1]+arr[i].number;
}
dp[0]=0;
for(int i=1;i<=num;i++)
{
int min=1<<30;
for(int j=0;j<i;j++)
if(min>dp[j]+(sum[i]-sum[j]+10)*arr[i].value)
min=dp[j]+(sum[i]-sum[j]+10)*arr[i].value;
dp[i]=min;
}
printf("%d\n",dp[num]);
}
return 0;
}