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