DP POJ1260

来源:互联网 发布:linux查看gpu使用情况 编辑:程序博客网 时间:2024/06/06 01:17

题目

题目链接

1.题意:

 给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。
对于样例Input的第一个例子:
2
100 1
100 2
按常规支付为 (100+10)*1 + (100+10)*2 =330元
但是全部按第二类珍珠的价格支付,同样买200个,虽然总体质量提升了,但是价格也提高了: (202+10)*2=424元。

2.要求:

  • N, case数
  • c<100, 珍珠的种类
  • i 行:a[i]是要求买该中珍珠的个数。
        p[i]是该珍珠的价格。
  • 样例是按照珍珠的价格升序排列。

思路:

  这个题目和图像压缩是一模一样的。因为每次购买一种新珍珠的时候都要支付额外的金额,因此该题的主要任务是找出一个分段,确定从哪几种珍珠处断开,使得花费最小。

  • dp[i]:购买前i种珍珠所需要的最小花费
  • sum[i] : 前i中珍珠总计珍珠数目
  • dp[i]=min(dp[i],dp[k]+(sum[i]sum[k]+10)p[i])k0 ~ i1.

代码:

#include <cstdio>#include <iostream>#include <cmath>using namespace std;int p[100+5],dp[100+5],a[100+5],sum[100+5];int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {        int N;        scanf("%d",&N);        memset(sum,0,sizeof(sum));        for(int i = 1; i<=N; i++){             scanf("%d%d",&a[i],&p[i]);             sum[i] = sum[i-1] + a[i];        }        dp[0] = 0;        for(int i = 1; i<=N; i++){            dp[i] = 100000000;            for(int k = 0; k<i; k++)                dp[i] = min(dp[i], dp[k]+(sum[i]-sum[k]+10)*p[i]);        }        printf("%d\n",dp[N]);    }}
0 0
原创粉丝点击