POJ 1260 Pearls (简单DP)
2015-10-08 12:10
429 查看
题目大意
给出n类珠子,以及每类珠子的数量num[i]和单价val[i]。单价从小到大排序,买每一类珠子的价格是(num[i]+10)*val[i]。问买sum(num[i])的珠子,所需最少花费。其中,价格较低的珠子可有价格高的珠子替代,反之不行。
分析
很容易看出,珠子是不能跳跃替代的。比如说,若用第3类珠子替代第1类珠子时,则第2类珠子也要由第3类珠子替代。否则,用第2类珠子替代第1类珠子更优。dp[i]表示买前i类珠子sum(num[i])颗所需最少花费
状态转移方程
dp[i] = min(dp[i] , (tmp + num[i]) * val[i]);
tmp = num[i] + num[i-1] + … num[k] , k >0。
初始化 dp[i] = dp[i-1] + (num[i]+10) * val[i]
时间复杂度O(n^2)
代码
#include <iostream> using namespace std; const int maxn = 1010; int num[maxn] , val[maxn]; int dp[maxn] = {0}; //dp[i]表示前i类珠子的最少花费 int main() { int t , n; cin >> t; while(t--) { cin >> n; for(int i = 1; i <= n; i++) cin >> num[i] >> val[i]; dp[1] = (num[1] + 10) * val[1]; for(int i = 2; i <= n; i++) { dp[i] = dp[i-1] + (num[i]+ 10) * val[i]; int tmp = num[i]; for(int j = i - 1; j > 0; j--) { tmp += num[j]; dp[i] = min(dp[i] , (tmp + 10) * val[i] + dp[j-1]); } } cout << dp << endl; } return 0; }
相关文章推荐
- 64位windows下用powerdesigner16链接mysql建立逆向工程
- [LeetCode]: 53: Maximum Subarray
- Swift lazy 修饰符和方法
- android实现添加耳机状态图标的方法
- Xcode创建一个本地的Html
- jQuery动态添加删除表格的行和列
- iOS 开发常用网站
- 一位数码管引脚
- 安卓切换Activity时的动画效果
- iOS中strong和weak指针
- IOS学习之苹果设备分辨率一览表
- ConcurrentHashMap 和CopyOnWriteArrayList线程安全
- Maven WEB 项目使用ProGuard进行混淆,最佳解决方案
- apache httpd 禁止目录浏览 及 安全配置
- HDOJ 1300 Pearls 斜率优化dp
- 4034: [HAOI2015]T2 (树链剖分)
- C++默认参数与函数重载 注意事项
- 全局探索式测试
- hadoop ,传智播客目录
- Android和iOS中Cocos2D日志为什么会出现skip frames