DP动态规划问题 1300
2017-09-25 22:09
274 查看
/* HDU1300 DP 给定n种珠宝 每种珠宝两个数据,num[i]代表数量,price[i]代表单价 购买珠宝时要满足以下购买规则: 单独买:每种珠宝要加上数量10 合并买:可以把连续几种珠宝数量合并,再加上10,单价按照price最大的计算 求出购买所有的珠宝最少要花费多少 思路: 初始化:第一种珠宝 只需要管当前第i种珠宝的购买 购买方法一:前i-1种按照前面的最优值购买(无后效性),第i种单独买 则: dp[i]=dp[i-1]+price[i]*(num[i]+10); 购买方法二:从第j种到第i种数量合并购买,其中j从1取到i 则: dp[i]=dp[j-1]+(aum[i]-sum[j-1]+10)*price[i]; 注意一定会是部分合并买,而不会分散 (升序排列的,如果第k种可以合并k+1,k-1种可以合并k,那么三者必定合并在一起 结果:dp */ #include<cstdio> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #define maxn 1010 using namespace std; int main() { int T; cin>>T; int dp[maxn]; int sum[maxn]; int num[maxn]; int price[maxn]; while(T--) { int n; cin>>n; memset(dp,0,sizeof(dp)); sum[0]=0; for(int i=1;i<=n;i++) { cin>>num[i]>>price[i]; sum[i]=sum[i-1]+num[i];//初始化sum[i]为前i种都分别买的数量总和 } dp[1]=(num[1]+10)*price[1]; for(int i=2;i<=n;i++) { dp[i]=dp[i-1]+price[i]*(num[i]+10); for(int j=1;j<=i;j++) dp[i]=min(dp[i],dp[j-1]+(sum[i]-sum[j-1]+10)*price[i]); } cout << dp << endl; } return 0; }
相关文章推荐
- dp 数塔 经典动态规划问题
- HDU5860(约瑟夫环问题。超级牛B的动态规划思维题,DP嘛,推出递推式谁不会写)
- 程序设计实习动态规划练习 Charm Bracelet(0/1背包问题dp)
- DP动态规划_01背包问题
- leetcode 322. Coin Change 类似背包问题 + 很简单的动态规划DP解决
- DP动态规划问题(1)
- 背包问题(dp动态规划思路详解)
- 动态规划和背包dp问题
- 动态规划(Dynamic programming,DP),通过把原问题分,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:
- Sicily 1146 采药(DP动态规划——01背包问题)
- 动态规划DP问题分类和经典题型
- 动态规划:HDU1864-最大报销额(处理带小数的dp问题)
- uva 357 - Let Me Count The Ways(动态规划-注意dp初始化的问题)
- 动态规划解TSP问题(状态压缩dp)
- HDU 2159 FATE (动态规划dp之二维完全背包问题)
- [DP]一道动态规划——理想收入问题
- 树上的动态规划;树的最大独立集;刷表DP,子问题彼此独立没有交集; 无根树转化有根树;
- 动态规划:背包问题(DP系列)
- leetcode 279. Perfect Squares 类似背包问题 + 很简单的动态规划DP解决
- 最优配对问题(集合上的动态规划) —— 状压DP