POJ-1260 Pearls (dp)

来源:互联网 发布:java post 二进制 编辑:程序博客网 时间:2024/05/27 14:14

题目链接:点击打开链接

题意:

    给你n种宝石的价格, 数量( 宝石的质量依次升高,). 求花费的最小值.

条件是:

        1: 你每买一种宝石, 你必须多买10个.

        2: 你可以用高质量的宝石代替低质量的宝石.

思路:

        dp[i]代表买到第i种宝石需要花费的最小数目.

状态转移方程:

dp[i] = min(dp[i], (sum[i]- sum[j] + 10)*p[i] + dp[j]);sum[i]代表从1到i等级的宝石总数目.意思就是: 让j从1到n枚举, 将从j到i的宝石全部换成i等级宝石, 从中取最小值.

代码如下:

#include <iostream>using namespace std;int main(){    int T;    cin>>T;    while(T--)    {        int c, *a, *p, *dp, *sum;        cin>>c;        a = new int[c+1];        p = new int[c+1];        dp = new int[c+1];        sum = new int[c+1];        sum[0] = 0;        for(int i = 1;i <= c;i++)            cin>>a[i]>>p[i], sum[i] = sum[i-1] + a[i];        dp[0] = 0;        for(int i = 1;i <= c;i++)        {            dp[i] = dp[i-1] + (a[i] + 10)*p[i];            for(int j = 0;j < i;j++)                dp[i] = min(dp[i], (sum[i]- sum[j] + 10)*p[i] + dp[j]);        }        cout<<dp[c]<<endl;        delete a;        delete dp;        delete sum;        delete p;    }    return 0;}


0 0
原创粉丝点击