poj1260
给定n类等级的珍珠
每类的珍珠都有需求的个数ai,和价格pi
为了防止游客只买1颗珍珠,所以购买ai个珍珠时,要加上10个的价格
即(ai+10)*pi
有时,购买高等级的珍珠代替低等级的珍珠时,可能更便宜,
比如说
2
5 5
100 10 这样的数据
(5+10)*5 + (100+10)*100 = 1175
(100+10+5)*10 = 1150
题目要求我们求最小的花费
a < b < c < d
如果b用c替换时,那么d是不可能替换a的,
用c替换a明显更优,所以只要考虑连续的一段是不是被替换了即可
dp[i]购买前i类珍珠的最小花费
那么dp[i] = min(dp[i],dp[j] + (sum[i]-sum[j-1]+10)*p[i])
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <string> 12 #include <math.h> 13 using namespace std; 14 #pragma warning(disable:4996) 15 #pragma comment(linker, "/STACK:1024000000,1024000000") 16 typedef long long LL; 17 const int INF = 1<<30; 18 /* 19 a < b < c < d 20 会不会发生b用c替换,a用d替换呢? 21 不会,因为pc*a < pd*a 22 所有如果c没有被d替换,那么c之前的也不会被d替换, 23 所有只要考虑连续的一段是不是被替换了即可 24 */ 25 const int N = 1000 + 10; 26 int a[N], p[N], sum[N]; 27 int dp[N]; 28 int main() 29 { 30 int t, n; 31 scanf("%d", &t); 32 while (t--) 33 { 34 scanf("%d", &n); 35 for (int i = 1; i <= n; ++i) 36 { 37 scanf("%d%d", &a[i], &p[i]); 38 sum[i] = a[i]; 39 sum[i] += sum[i - 1]; 40 } 41 42 for (int i = 1; i <= n; ++i) 43 { 44 dp[i] = INF; 45 for (int j = 0; j < i; ++j) 46 { 47 dp[i] = min(dp[i],dp[j] + (sum[i] - sum[j] + 10)*p[i]); 48 } 49 } 50 printf("%d\n", dp[n]); 51 } 52 return 0; 53 }