您的位置:首页 > 其它

POJ-1260 Pearls (dp)

2016-08-19 21:26 369 查看
题目链接:点击打开链接

题意:

    给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: