`

poj 1260

 
阅读更多

题意解释:

n个等级的珠宝,等级依次升高,等级越高价钱越高,每买一个等级的任何数量的珠宝必须多付10颗此种珠宝的价钱,可以用高等级的珠宝代替低等级的,问要买到若干规定的数量和等级珠宝的最少花费。例如买5颗价值为10的、100颗价值为20的珠宝,有两种方案:一种为分别买两种等级的珠宝价钱为(5+10)*10+(100+10)*20 = 2350;另一种是将等级低的(即价格低)的珠宝全部换为等级高的,此时价钱为(5+100+10)*20 = 2300,故第二种方案较优。

解题思路:

首先需要证明一点,用高一等级的代替低一等级的必须是连续代替。例如 3 590 7100 12要想代替35价值的首先考虑用7价值的代替,因为3*7=21 3+10*5=65 显然比较合算,这样就不需要考虑用12价值的那个代替了,因为前面已经有了最优解,也就是说相互代替不会跳跃。

证明这一点后开始分析,用sum[i]表示前i中珠宝总数,对于第i等级珠宝,dp[i]表示其最优解,那么dp[i]可能是(sum[i]+10) *p[i] 即前面所有的珠宝用i的价值去买,或者(sum[i]-sum[1]+10)*p[i]+dp[1] 即从第二个开始前面的所有珠宝用i的价值去买,或者(sum[i]-sum[2] +10*p[i] + dp[2] 即从第三个。。。依次计算,其中最小的一个就是i的解。注意,上面提到的跳跃是指不用i+1等级珠价值去计算i等级以及其以下的珠宝,但可以将i以下等级的珠宝归为等级为i的价格进行计算,这样就会保证当前价值最小。这样状态方程便有dp[i]=min(dp[i],(sum[i]-sum[j]+10)*p[i]+dp[j]),(1<=j<=i)。

在写状态方程时是整体到局部的思路去考虑,具体写代码特别是边界条件时则需要自底下向上推导。通常需要将状态数组(此题为dp[])分开处理,即先对其边界赋值,处理特殊情况,再按状态方程进行计算。

代码如下:

#include <stdio.h>
#include <string.h>
int tcase, n, a[2000], p[2000], dp[2000], sum[2000];

int min (int x, int y)
{
	return x>y?y:x;
}

int main ()
{
	int i, j;
	scanf("%d", &tcase);
	while(tcase--)
	{
		memset(dp, 0, sizeof(dp));
		sum[0] = 0;
		scanf("%d", &n);
		for (i = 1; i <= n; i++)
		{
			scanf("%d%d", &a[i], &p[i]);
			sum[i] = sum[i-1] + a[i];
			dp[i] = (sum[i]+10) * p[i];
		} // 数组临界预处理。
		for (i = 1; i <= n; i++)
			for (j = 1; j <= i; j++)
				dp[i] = min (dp[i], (sum[i]-sum[j]+10)*p[i] + dp[j]);
			// 根据状态转移方程计算数组。
			// 此处取最小值的方法较巧妙,值得学习。
			printf("%d\n", dp[n]);
	}
	return 0;
}

 

 

 

 

 

分享到:
评论

相关推荐

    POJ1260-Pearls

    【标题】"POJ1260-Pearls" 是北京大学在线编程平台POJ上的一道题目,这道题目主要考察的是算法设计和实现能力。POJ(Problem Online Judge)是一个面向全球程序员的在线编程练习系统,它提供了大量的编程题目供用户...

    北大POJ1260-Pearls

    北大POJ1260-Pearls

    poj1260 —— 最少的钱买完所需珍珠

    c表示有多少种珍珠 ai 表示第i种珍珠所需的数量 pi 表示第i种珍珠的价钱 每买一种珍珠都需要付额外的10 * pi的钱,便宜的珍珠可以用贵的珍珠来代替,求最少的钱的总数。

    POJ算法题目分类

    * 型如下表的简单 DP:型如下表的简单 DP 是指解决问题的简单 DP 算法,如 poj3267、poj1836、poj1260、poj2533。 * 计算几何学:计算几何学是指解决问题的计算几何学算法,如 poj2031、poj1039。 六、数学 数学...

    poj题目分类

    * 类型 DP:例如 poj3267、poj1836、poj1260、poj2533。 中级 1. 基本算法: * C++的标准模版库的应用:例如 poj3096、poj3007。 * 较为复杂的模拟题的训练:例如 poj3393、poj1472、poj3371、poj1027、poj2706...

    acm训练计划(poj的题)

    - (poj3267, poj1836, poj1260, poj2533):零一背包、完全背包等问题的解决方案。 3. **二维动态规划**: - (poj3176, poj1080, poj1159):多维状态转移方程的应用。 ### 五、组合数学 1. **排列组合基础**: ...

    经典 的POJ 分类

    - POJ 1260、POJ 2533:涉及多个变量的状态转移。 - POJ 3176、POJ 1080:复杂的状态空间定义与状态转移。 ### 数学问题 #### 组合数学 - **题目示例**: - POJ 3252、POJ 1850:组合数学原理的应用。 - POJ ...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ ... - 推荐题目:[poj3267](https://vjudge.net/problem/POJ-3267)、[poj1836](https://vjudge.net/problem/POJ-1836)、[poj1260](https://vjudge.net/problem/POJ-1260)、[poj2533]...

    ACM-POJ 算法训练指南

    1. **凸包**:构建点集的凸包(poj3267, poj1836, poj1260, poj2533)。 2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ...

    POJ 分类题目

    - poj1260 - poj2533 - poj3176 - poj1080 - poj1159 - **应用场景**:适用于路径规划、编辑距离计算等问题。 #### 六、数学 **1. 组合数学** - **定义**:研究离散对象的计数方法。 - **示例题目**: - poj...

    ACMer需要掌握的算法讲解 (2).docx

    * DP算法:POJ3267、POJ1836、POJ1260、POJ2533 二、图算法 * 度限制最小生成树和第K最短路:POJ1639、POJ3216、POJ2446 * 最优比率生成树:POJ2728 * 最小树形图:POJ3164 * 次小生成树 * 无向图、有向图的最小环...

    ACM常用算法及其相应的练习题.docx

    * 类似表的简单 DP:poj3267, poj1836, poj1260, poj2533 * 最长公共子序列:poj3176, poj1080, poj1159 * 最优二分检索树问题 六、数学 * 组合数学: + 加法原理和乘法原理 + 排列组合 + 递推关系 - poj3252...

    ACM常用算法及其相应的练习题 (2).docx

    (2) 简单DP:poj3267, poj1836, poj1260, poj2533 (3) 其他DP问题: 六、中级算法 本部分涵盖了中级算法,包括C++的标准模版库的应用、较为复杂的模拟题的训练、差分约束系统的建立和求解、最小费用最大流、双连通...

    北大acm试题

    poj1837和poj1276是背包问题的实例,而型如下表的简单DP问题,如poj3267、poj1836、poj1260和poj2533,以及最长公共子序列问题(如poj3176、poj1080和poj1159)都是动态规划的典型应用。 六、数学 数学在编程竞赛中...

    ACM常用算法及其相应的练习题 (2).pdf

    例题:poj3267、poj1836、poj1260、poj2533。 六、数学 * 组合数学:组合数学是指研究counting和enumeration的数学分支。例题:poj3252、poj1850、poj1019、poj1942。 * 数论:数论是指研究整数和其他数学对象的...

    很快速的提高算法能力.docx

    - **表格型DP**:掌握不同类型的DP问题,如Poj3267、Poj1260等。 6. **数学** - **组合数学**:学习加法原理、乘法原理、排列组合和递推关系,如Poj3252、Poj1850等。 - **数论**:涉及素数、整除、进制位和模...

    算法训练方案详解

    - **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...

    acm新手训练方案新手必备

    - POJ 1260: 多重背包问题 - POJ 2533: 背包问题的特殊应用 - **编辑距离**:用于计算两个字符串之间的最小编辑距离。 - **示例题目**: - POJ 3176: 编辑距离问题 - POJ 1080: 编辑距离的变种 - POJ 1159: ...

    ACM算法总结--最新总结的ACM算法

    2. **区间DP**(如poj3267, poj1836, poj1260, poj2533):涉及区间状态的动态规划,如股票买卖最佳时机、矩阵链乘积等。 3. **矩阵链乘法**(如C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}):求解多个矩阵相乘时的最优顺序...

    LeetCode判断字符串是否循环-Leetcode:刷!

    1260 POJ 1015 POJ 3176 POJ 1080 POJ 1159 POJ 2533 POJ 1836 Leetcode 70 Leetcode 309 搜索 DFS POJ 2488 POJ 3083 POJ 3009 POJ 1321 BFS POJ 3278 POJ 1426 POJ 3126 POJ 3414 POJ 2251 简单搜索技巧和剪枝 POJ...

Global site tag (gtag.js) - Google Analytics