http://acm.hdu.edu.cn/showproblem.php?pid=1300

这题大一就看到过,当时没读懂题目,今天再做就容易多了

题意:升序给出n个珍珠的的数量和价值,问买这些珍珠的最小花费,其中可以用价值高的珍珠等量代替价值小的珍珠,并且一种价钱如果决定买,必须多买10个保底

水dp,dp[i]表示买前i种珍珠的最小花费,枚举代替的区间

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <cmath>

using namespace std;

int dp[105],a[105],p[105];

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<105;i++)dp[i]=0xfffffff;
        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i],&p[i]);
           dp[1]=(a[1]+10)*p[1];
        for(int i=2;i<=n;i++){
            for(int j=1;j<=i;j++){
                int res=dp[j-1];
                int cnt=0;
                for(int k=j;k<=i;k++){
                    cnt+=a[k];
                }
                res+=(cnt+10)*p[i];
                dp[i]=min(dp[i],res);
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}
View Code