Sicily 1073. Pearls[动规]
2010-07-19 15:48
204 查看
DP题,只有分想到与想不到....
这里定义f[i]用来存储有i种pearl时的最小花费,则这里可以得出以种类数为状态的动规,先给出转移方程
f[i]=min{f[j]+(need[k]+need[k+1]+...+need[i]+10)*price[i]}(1<=k<=i),(0<=j<i)(初始化 f[0]=0)
这里由方程可以看出,是将种类j和i之间的pearl都按照i的价格计算得出的最小值,j的取值为小于i的任意非负整数,当j=0是,即将所有pearl都按照第i中的价格出售的总值,由于不存在第0种的情况,故数量求和时,k从1开始。
DP题还是多做才能掌握啊...
代码:
这里定义f[i]用来存储有i种pearl时的最小花费,则这里可以得出以种类数为状态的动规,先给出转移方程
f[i]=min{f[j]+(need[k]+need[k+1]+...+need[i]+10)*price[i]}(1<=k<=i),(0<=j<i)(初始化 f[0]=0)
这里由方程可以看出,是将种类j和i之间的pearl都按照i的价格计算得出的最小值,j的取值为小于i的任意非负整数,当j=0是,即将所有pearl都按照第i中的价格出售的总值,由于不存在第0种的情况,故数量求和时,k从1开始。
DP题还是多做才能掌握啊...
代码:
]#include <iostream> #include <cstring> using namespace std; const int MAXINT=2140000000; int main() { int cases; int n; cin>>cases; for (int o=0;o<cases;o++) { cin>>n; int price[n+1]; int need[n+1]; int f[n+1]; for (int i=1;i<=n;i++) cin>>need[i]>>price[i]; f[0]=0; for (int i=1;i<=n;i++) { f[i]=MAXINT; for (int j=0;j<i;j++) { int amount=10; for (int k=j+1;k<=i;k++) amount+=need[k]; if (amount*price[i]+f[j]<f[i]) f[i]=amount*price[i]+f[j]; } } cout<<f <<endl; } return 0; }
相关文章推荐
- sicily 1073. Pearls
- Sicily 1013 Going Home
- LeetCode-63-Unique Paths II(动规)-Medium
- Sicily 1049 Mondriaan
- [bzoj1068]压缩[区间动规]
- 编辑距离(动规例题)
- 复制书稿(动规例题)
- <OJ_Sicily>Single-link Clustering
- <OJ_Sicily>1438Shopaholic
- <OJ_Sicily>1240Faulty_Odometer
- Sicily|2499. 平方数
- ACM: 动态规划题 sicily…
- <OJ_Sicily>DAG
- 【例题】【动规(最长XX子序列)】NKOJ 1042 合唱队形(NOIP)
- Sicily1282——Computer Game
- 【Sicily】1035. DNA matching
- <OJ_Sicily>数字反转
- sicily 1156. Binary tree
- The King’s Walk (动规)
- <OJ_Sicily>Polynomial