1 条题解
-
0
问题分析:
- 动态规划问题
- 决策点:是否将当前及后续等级合并采购
- 目标:最小化总成本
关键点:
- 合并采购可节省额外费用
- 只能向更高等级合并
- 需要比较所有可能的合并方案
解题步骤:
- 初始化dp数组,dp[i]表示前i个等级的最小成本
- 状态转移:
- 不合并:dp[i] = dp[i-1] + (a[i]+10)*p[i]
- 合并:枚举所有可能合并区间,计算合并后的成本
- 取最小值作为最终结果
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
- 上传者