1 条题解

  • 0
    @ 2025-5-6 19:53:21

    问题分析

    1. 动态规划问题
    2. 决策点:是否将当前及后续等级合并采购
    3. 目标:最小化总成本

    关键点

    • 合并采购可节省额外费用
    • 只能向更高等级合并
    • 需要比较所有可能的合并方案

    解题步骤

    1. 初始化dp数组,dp[i]表示前i个等级的最小成本
    2. 状态转移:
      • 不合并:dp[i] = dp[i-1] + (a[i]+10)*p[i]
      • 合并:枚举所有可能合并区间,计算合并后的成本
    3. 取最小值作为最终结果
    using namespace std;  
      
    int min(int a,int b)  
    {  
        return a<b?a:b;  
    }  
      
    int main(int i,int j)  
    {  
        int test;  
        cin>>test;  
        while(test--)  
        {  
            /*Input & Initial*/  
      
            int c;  
            cin>>c;  
      
            int* a=new int[c+1];  //某类珍珠数目  
            int* p=new int[c+1];  //某类珍珠单价  
            int* dp=new int[c+1]; //dp[i]表示在已知第i类珍珠时,所需支付的最低价格  
            int* sum=new int[c+1];//sum[i]=∑a[i]  
      
            sum[0]=0;  
            for(i=1;i<=c;i++)  
            {  
                cin>>a[i]>>p[i];  
                sum[i]=sum[i-1]+a[i];  
            }  
      
            /*Dp*/  
      
            dp[0]=0;  //Dp初始化  
            for(i=1;i<=c;i++)  
            {  
                dp[i]=(a[i]+10)*p[i]+dp[i-1];   //当第i种珍珠出现时,未优化价格的情况  
                for(j=0;j<i;j++)  //枚举第i种珍珠前的每一种珍珠,寻找最优价格  
                    dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]);  //在求dp[i]前,对于每一个j<i,dp[j]的最优值已求出  
            }                                                        //(sum[i]-sum[j]+10)*p[i]即第j+1~i种珍珠被第i种珍珠替代后的价格  
            cout<<dp[c]<<endl;  
      
            delete a,p,dp,sum;  
        }  
        return 0;  
    }  
    
    • 1

    信息

    ID
    261
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者