poj 1260 Pearls(dp)

题目:http://poj.org/problem?id=1260

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

珍珠的替代必须是连续的,不能跳跃替代(这个不难证明,因为假如用第i+2类去替代第i类珍珠,会使最终的支付价格降低,那么用第i+1类去替代第i类珍珠会使最终的支付价格更加低)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int t,i,j,num,minn,sum;
10     int d[1100],n[1100],p[1100];
11     cin>>t;
12     while(t--)
13     {
14         cin>>num;
15         for(i=1; i<=num; i++)
16         cin>>n[i]>>p[i];
17         d[0]=0;
18         for(i=1; i<=num; i++)
19         {
20             minn=1000000000; sum=n[i];
21             for(j=i-1; j>=0; j--)
22             {
23                 minn=min(minn,d[j]+(sum+10)*p[i]);//状态转移方程,d[i]表示到i种的时候的最优值,在这个循环里是
24                 //比较前面的最优加 后面(到i)所有种珍珠转换成第i种珍珠的值。
25                 sum+=n[j];
26             }
27             d[i]=minn;
28         }
29         cout<<d[num]<<endl;
30     }
31     return 0;
32 }
原文地址:https://www.cnblogs.com/bfshm/p/3386705.html