poj 1260 动态规划
题意:给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。
规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p,输入的价格递增。
例如:
3
1 10
1 11
100 12
需要买第一类1个,第二类1个,第三类100个
按常规支付为 (1+10)*10 + (1+10)*11 + (100+10)*12 = 1551元(一共买了102个珍珠)
但是如果全部都按照第三类珍珠的价格支付,同样是买102个,而且其中总体质量还被提高了,但是价格却下降了:(102+10)*12 = 1344元
分析:设三种珍珠的个数和价格分别为(a1 p1), (a2 p2), (a3 p3),假设最优解中,珍珠1被3替代,(a1 + 10)*p1 > a1 * p3, 因为p2<=p3(价格升序), 则(a1+10)*p1 > a1*p2, 即1一定能被2替代,所以第i 种珍珠,可以一种都不替代,或者替代i-1到i 种,或者i-2到i 种......
dp[i]=min(dp[i],(sum[i]-sum[j]+10)*p[i]+dp[j]), (0<=j<i)
const int M = 102; int a[M], price[M], dp[M], sum[M]; int n; int main(){ int t; cin>>t; while(t--){ cin>>n; FOE(i, 1, n){ cin>>a[i]>>price[i]; sum[i] = sum[i-1]+a[i]; } memset(dp, -1, sizeof dp); dp[0] = 0; FOE(i, 1, n) FOE(j, 1, i) checkmin(dp[i], dp[j-1]+(sum[i]-sum[j-1]+10)*price[i]); cout<<dp[n]<<endl; } return 0; }