poj 1260 Pearls (dp)

来源:互联网 发布:sql查询前10条记录 编辑:程序博客网 时间:2024/05/29 23:23

题意:不同等级的宝石,每个等级买了后等要额外付出10枚的钱,每一档可以买更高档的来代替,问全部宝石一共最少可花多少钱。

思路:一开始想的是贪心,然后发现不行;(别问为什么,你自己举个例子就会知道的);

f[i] = min{f[k] + (a[k+1] + a[k+2] ... +a[i] + 10) * p[i];
a[i]表示第i个class要买的数目
p[i]表示第i个class的单个价格
f[i]表示买到第i个时付的最少的钱(第i个一定要买)

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>using namespace std;const int MAXN = 108;struct thing {    int a, p;} fuck[MAXN];int dp[MAXN];int cmp(thing aa, thing bb) {    return aa.p < bb.p;}int main() {    int t, c, i, j;    scanf("%d", &t);    while(t--) {        scanf("%d", &c);        for(i = 1; i <= c; i++) {            scanf("%d%d", &fuck[i].a, &fuck[i].p);        }        //之前看见贪心错了,加了这个(不能加,加了就错,数据有点问题)        //sort(fuck+1, fuck+c+1, cmp);        for(i = 1; i <= c; i++) {            int tmp = fuck[i].a+10;            dp[i] = dp[i-1]+tmp*fuck[i].p;            for(j = i-1; j > 0; j--) {                tmp += fuck[j].a;                if (dp[i] > dp[j-1]+tmp*fuck[i].p)                    dp[i] = dp[j-1]+tmp*fuck[i].p;            }        }        printf("%d\n", dp[c]);    }    return 0;}

0 0