zoukankan      html  css  js  c++  java
  • POJ-1260 Pearls 【DP】

    题目链接

    题意

    某公司需采购c种珍珠,知道每种珍珠的价格和需要的量。购买时,若要买某种珍珠,需额外支付10个该种珍珠的价钱。同时价格低的珍珠可以用价格高的珍珠代替。求最少能花多少钱完成采购。

    分析

    解决本题关键要想到这一点:

    若第i种珍珠可以被第j种珍珠代替(i< j且珍珠价格递增),则第i~j-1种珍珠都应当被第j种珍珠代替。

    证明很简单,这里省略。所以最终的采购的方式就是将整个珍珠种类的区间进行划分,每个划分子区间里的珍珠都按该子区间的右端点进行采购。

    由此设状态dp[i]为完成前i种珍珠的最少花费,那么转移方程:

    dp[i]=minji(dp[j]+(sum[i]sum[j]+10)p[i])

    复杂为O(n2),本题数据量小,不需要优化。当数据量大时,可以斜率优化。

    AC代码

    //POJ-1260 Pearls
    //AC 2017-2-25 15:25:06
    //DP
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int maxn=105;
    
    int T,c;
    int sum[maxn],p[maxn];
    long long dp[maxn];
    int main()
    {
        cin>>T;
        while(T--)
        {
            cin>>c;
            sum[0]=0;
            for(int i=1;i<=c;++i)
            {
                cin>>sum[i]>>p[i];
                sum[i]+=sum[i-1];
            }
            for(int i=1;i<=c;++i)
            {
                dp[i]=(sum[i]+10)*1LL*p[i];
                for(int j=1;j<i;++j)
                    dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*1LL*p[i]);
            }
            cout<<dp[c]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    关于sqrt函数的使用
    电子商务
    随笔
    哈哈
    整体管理
    软件产品质量特性
    问题
    风险
    antd
    Flex布局大作用
  • 原文地址:https://www.cnblogs.com/DrCarlluo/p/6580572.html
Copyright © 2011-2022 走看看