DP动态规划问题 1300

/*
	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[n] 
*/ 

#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[n] << endl;
	}
	return 0;	
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值