hdu 1300 Pearls(DP)

题意:

有N种【价格从低到高】珍珠,每种珍珠有一个价格。每种珍珠有一个需要的个数。

如果你决定买某种珍珠x个,则需要额外多买10个。【防止游客购买少量】

你可以把低价格的珍珠换成高价格的珍珠,但不允许把高价格的珍珠换成低价格的珍珠。

问总共最少需要花多少钱。

思路:

假设第 i 种珍珠需要X个。可以知道要么这X个用这个价格买,要么就归到更高价格的珍珠里去买。【想想就明白了】

也就是,有的珍珠0个,有的珍珠好多。也就是某个珍珠种类的前k种珍珠都归到这个珍珠种类去买。

DP结构出来了。

dp[i]:前 i 种珍珠,第 i 种珍珠要买若干个所花的最少钱是多少。

dp[i]=max( dp[i],dp[j]+(sum[i]-sum[j-1]+10)*p[i] )

代码:

int n;
int sum[105], num[105], p[105];
int dp[105];


int main(){

    int T;
    cin>>T;
    while(T--){
        scanf("%d",&n);
        sum[0]=0;
        rep(i,1,n){
            scanf("%d%d",&num[i],&p[i]);
            sum[i]=sum[i-1]+num[i];
        }

        mem(dp,inf);

        dp[0]=0;
        rep(i,1,n){
            rep(j,0,i-1){
                dp[i]=min( dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i] );
            }
        }
        printf("%d
",dp[n]);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/fish7/p/4334682.html