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;
}

 

posted @ 2013-06-19 11:55  心向往之  阅读(98)  评论(0编辑  收藏  举报