题意:有n种不同的珍珠 每种珍珠的价格不同  现在给出一个采购单 标注了需要不同等级的珍珠和相对于的个数(输入按价格升序排列)

  其中 价格为   (当前种类价格+10)*购买数量  这样就有一种诡异的现象,当你把购买x个 低价格珍珠的时候 可能还没有把x个低价格珍珠

  换成高价格珍珠来购买 总价更便宜 同时采购上的珍珠只能低的换高的价格买 让你求最小总价

  思路: 1. 不能跳跃着换  比如  价格分别为  x  x+1 x+2  不可能 x+1不动只换x到x+2买 因为如果x换到x+2买总价可以更便宜,那么换到x+1买肯定更更更便宜

     2.因为不能跳跃着换,但存在一种情况:一层一层往右边叠  比如上述 x 换到x+1   再把原先x(现在在x+1)和x+1的换到x+2更便宜

     3.购买珍珠数量一定  因为没有什么满多少打折等骚操作 所以不可能多买  多买一定要多付钱

  令dp[i]表示在已知第i类珍珠时,所需支付的最低价格

  则状态方程为:

  dp[i]=(a[i]+10)*p[i]+dp[i-1];  //当第i种珍珠出现时,未优化价格的情况

  dp[i]=min(dp[i],(sum[i]-sum[j]+10)*p[i]+dp[j]);  //枚举j,价格优化

  参考:https://blog.csdn.net/lyy289065406/article/details/6648131
  

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=;
int a[maxn],dp[maxn],sum[maxn],p[maxn];
int main(){
int t ;
scanf("%d",&t);
while(t--){
int n;
sum[]=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i],&p[i]);
sum[i]=sum[i-]+a[i];
}
dp[]=;
for(int i=;i<=n;i++){
dp[i]=(+a[i])*p[i]+dp[i-];
for(int j=;j<=i;j++){
dp[i]=min(dp[i],dp[j-]+(sum[i]-sum[j-]+)*p[i]);
}
}
cout<<dp[n]<<endl; } return ;
}

最新文章

  1. linux tree 命令
  2. C++ 系列:内存布局
  3. ASP.NET获取真正的客户端IP地址的6种方法
  4. C Primer Plus(第五版)4
  5. SharePoint 2013 中使用 JavaScript Like 和Unlike list item/page/document
  6. C++ typedef typename
  7. CentOS+Apache+php无法访问redis的解决方法
  8. mysql查询语句理解
  9. 转:Javascript继承机制的设计思想
  10. iOS开展-Xcode技巧总结(持续更新)
  11. Android AIDL使用特定的解释
  12. JSP异常之org.apache.jasper.JasperException(转)
  13. angular路由模块(二)
  14. GlusterFS群集存储项目
  15. Angular4中使用后台去数据,Swiper不能滑动的解决方法(一)
  16. [android] 内容提供者实现
  17. Ontology
  18. 四.awk、sde深度讲解
  19. virtual box 下安装centos 7
  20. 利用Backtrace来捕获段错误堆栈信息

热门文章

  1. C# Type.GetType 返回NULL 问题解决记录
  2. H5 18-序选择器
  3. 便于记忆的SA构造
  4. 使用fiddlercore修改网页的返回内容
  5. 钢琴培训班课程、课时及费用管理系统已提供ACM3.0新版下载
  6. JQuery 的Ajax的使用
  7. static特别用法【静态导包】——Java包的静态导入
  8. Java.lang.OutOfMemoryError:Metaspace
  9. http1.0 1.1 与2.0
  10. 【学亮IT手记】MySql行列转换案例