hdu1300 pearls 【dp】
来源:互联网 发布:大富豪棋牌源码3.4.1 编辑:程序博客网 时间:2024/06/06 02:32
题目大意:
给定n种珠宝
每种珠宝两个数据,a[i]代表数量,p[i]代表单价
按 p[i]从小到大排。
购买珠宝时要满足以下购买规则:
单独买:每种珠宝要加上数量10
合并买:可以把连续几种珠宝数量合并,再加上10,单价按照price最大的计算
求出购买所有的珠宝最少要花费多少
解题思路:
直接把a[i]合并为前缀和。
f[i]表示买到第i种珠宝的最优值。
设从第j种开始一起买。
则f[i]=min(f[i],f[j-1]+(a[i]-a[j-1]+10)*p[i]),1<=j<=i;
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#include<vector>#define ll long longusing namespace std;int getint() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')c=getchar(),f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f;}const int N=105,INF=0x3f3f3f3f;int T,n;int a[N],p[N],f[N];int main(){ //freopen("lx.in","r",stdin); T=getint(); while(T--) { memset(f,INF,sizeof(f)); f[0]=0; n=getint(); for(int i=1;i<=n;i++) a[i]=getint()+a[i-1],p[i]=getint(); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) f[i]=min(f[i],f[j-1]+(a[i]-a[j-1]+10)*p[i]); cout<<f[n]<<'\n'; }}
阅读全文
0 0
- hdu1300 Pearls--DP
- hdu1300 Pearls 【dp】
- hdu1300 pearls 【dp】
- dp斜率优化 Pearls(Hdu1300)题解
- hdu1300 Pearls
- HDU1300 Pearls (动态规划)
- hdu1300(水题也是dp)
- hdu1300
- HDU1300
- Pearls--DP
- POJ1260 Pearls DP
- POJ 1260 Pearls DP
- poj-1260-Pearls-dp
- hdu 1300 Pearls(dp)
- hdu 1300 Pearls DP
- ZOJ 1563 Pearls(DP)
- HDU 1300 Pearls(DP)
- poj 1260Pearls DP
- 面向对象练习
- python Debug 单步调试
- 发布订阅模式
- contextPath获取项目名
- 1092: 并查集(模版 家族)
- hdu1300 pearls 【dp】
- 对称的二叉树
- Jzoj4625 树
- 400和500错误的统一处理
- linux IO 内核参数调优
- 并查集求最小生成树
- final关键字的几种用法
- RecycleView布局
- how to improve deep learning performance