poj1260 Pearls (dp)
来源:互联网 发布:linux oracle切换实例 编辑:程序博客网 时间:2024/05/20 16:10
又是一道依靠别人的题解才做出来的dp,为什么要说“又”呢...233
题意:给出几类珍珠,以及它们的单价,规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p(什么鬼设定),低档的珍珠可以按高档珍珠的价钱买,反之不行,由于低档的按高档的买了,可以少支付低档的那10*p的钱,因此可能会比正常买便宜,现在要求算出买所有珍珠的最低价。
分析:思路类似脑经急转弯,只要注意到这一点就行了:若a、b、c三种珍珠,档次递增 ,若a被b替代能便宜,b被c替代也能便宜,则a被c替代一定能便宜。因此这种替代是连续的,要找的就是一个个不重叠的替代区间,区间内的所有珍珠都被最后一类珍珠替代。
由此可得状态转移方程:
dp[i] = (a[i] + 10)*p[i] + dp[i - 1]; 初始化,未进行优化前的价格
dp[i] = min(dp[i], (sum[i] - sum[j] + 10)*p[i] + dp[j]); 0<=j<i, 枚举j进行价格优化
代码如下:
#include <iostream>#include <fstream>#include <algorithm>#include <cstring>using namespace std;int a[105], sum[105], p[105];int dp[105];int main(){//fstream cin("test.txt");int k;cin >> k;while (k--){memset(sum, 0, sizeof(sum));int n;cin >> n;for (int i = 1; i <= n; i++){cin >> a[i] >> p[i];sum[i] = sum[i - 1] + a[i];}dp[0] = 0;for (int i = 1; i <= n; i++){dp[i] = (a[i] + 10)*p[i] + dp[i - 1];for (int j = 0; j < i; j++)dp[i] = min(dp[i], (sum[i] - sum[j] + 10)*p[i] + dp[j]);}cout << dp[n] << endl;}//system("pause");return 0;}这种dp说难不难,但自己独立做就是做不出..愁啊
阅读全文
0 0
- POJ1260 Pearls DP
- Pearls poj1260 (DP)
- poj1260 Pearls (dp)
- POJ1260 Pearls(DP)
- poj1260 Pearls(Dp)
- POJ1260-Pearls(dp)
- [poj1260] Pearls DP斜率优化
- poj1260--Pearls(dp,从一开始就想错了......)
- poj1260——Pearls(dp)
- 【POJ1260】【斜率优化DP】Pearls题解
- POJ1260--Pearls
- poj1260 Pearls
- poj1260 Pearls
- POJ1260 Pearls
- poj1260 pearls
- poj1260 Pearls
- poj1260 Pearls
- poj1260 Pearls
- python分片
- CF_An express train to reveries 【模拟】
- Html+Css学习第二天
- android studio Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]
- iOS 面霸面试题总结~[有答案]
- poj1260 Pearls (dp)
- linux文件通配符
- 线程的概念&线程控制&分离线程
- LeetCode | 4. Median of Two Sorted Arrays(中位数)
- linux的grub菜单加密
- linux 下给php安装扩展
- jquery子窗口给父窗口元素赋值和获得值,子窗口调取父窗口方法,父窗口调取子窗口方法
- 以安全的名义,为了那些高考的情怀和努力——
- Linux内核之双向通信Socketpair