HDU_1300 Pearls 【DP】
2018-02-06 10:52
429 查看
题目链接
对于这道题,需要将其可以分段连续购买的所有情况都考虑进去。
状态转移方程:
初始值dp[0]为0,dp[i]都是前i种珍珠单独购买的情况。接下来动态转移就是考虑所有可能连续购买的情况。
题目描述
一道特别长的英文题目,其实就是让你算一下怎么用最少的钱把这所有的珍珠给买下来。题目上给出n种珍珠,每种珍珠对应着数量和价格(价格从小到大排列)。你有两种购买方式:1.一次只买一种,但是需要你多买10个 2.可以连续着买多种,最后也需要多买10个,所有的珍珠都需按照价格最高的来计算(可以从任意位置开始连续,可以有多个连续)。解题思路
首先我们用一个dp[i]数组,dp[i]就代表的前i中珍珠的最小花费。对于这道题,需要将其可以分段连续购买的所有情况都考虑进去。
状态转移方程:
dp[j] = min(dp[j], dp[i - 1] + b[j] * (c[j] - c[i - 1] + 10));如果要算前j个的最小花费,可以将前j个的花费与前i - 1个的最小花费加上从i到j连续的花费和进行比较,按最小的去刷新dp[j]。
初始值dp[0]为0,dp[i]都是前i种珍珠单独购买的情况。接下来动态转移就是考虑所有可能连续购买的情况。
代码部分
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int maxn = 1e2 + 10; int main() { int t, n; cin >> t; while(t --) { cin >> n; int a[maxn], b[maxn], c[maxn], dp[maxn]; c[0] = 0; for(int i = 1; i <= n; ++ i) { cin >> a[i] >> b[i]; c[i] = c[i - 1] + a[i]; } dp[0] = 0; for(int i = 1; i <= n; ++ i) { dp[i] = dp[i - 1] + (a[i] + 10) * b[i]; } for(int i = 1; i <= n; ++ i) { for(int j = i; j <= n; ++ j) { dp[j] = min(dp[j], dp[i - 1] + b[j] * (c[j] - c[i - 1] + 10)); } } cout << dp << endl; } return 0; }
相关文章推荐
- HDU 1300 Pearls DP .
- HDU 1300 Pearls(DP)
- HDU 1300 Pearls(DP)
- hdu 1300 Pearls【dp】
- hdu 1300 Pearls(DP)
- hdu 1300 Pearls(DP)
- HDU 1300 Pearls--dp
- HDU 1300 Pearls(dp)
- HDU 1300 Pearls (dp)
- hdu 1300 Pearls(dp)
- HDU 1300 Pearls(DP 珠宝店进货问题)
- HDU - 1300 Pearls (dp)
- hdu 1300 Pearls(dp)
- HDU 1300 Pearls 动态规划 dp
- HDU 1300 Pearls(dp)
- POJ 1260 && HDU 1300 Pearls(dp)
- HDU 1300 Pearls(DP)
- hdu 1300 Pearls (dp)
- 【DP】HDU-1300 Pearls
- HDU 1300 Pearls (DP)