您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: