POJ 1157 LITTLE SHOP OF FLOWERS

题目大意:

        现有F束不同的花(1 ≤ F ≤ 100)和V瓶固定在架子上排好序的花瓶(F ≤ V ≤ 100),花编号为1 - F,花瓶在架子上从左到右编号为1 - V,编号小的花束必须插在编号大的花束所在瓶子的左边,每个瓶子只能插一束花,会有空瓶子。现不同花插在不同花瓶会有一个美观度,美观度范围为[-50, 50],对于不插花的瓶子美观度为0。

        现只有一个测例,测例中给出F和V以及一个F × V的矩阵,表示不同花在不同瓶子中的美观度,现求出一个最优的插花方法,是总体美观度最大。

题目链接

注释代码:

/*                                        
 * Problem ID : POJ 1157 LITTLE SHOP OF FLOWERS 
 * Author     : Lirx.t.Una                                        
 * Language   : C                       
 * Run Time   : 0 ms                                        
 * Run Memory : 152 KB                                        
*/ 

#include <stdio.h>

//美观值的无穷小
//小于100 × -50
#define	RINF		-5001

//花束的最大数量
#define	MAXN		101

#define	MAX(x,y)	( (x) > (y) ? (x) : (y) )

//aesthetic value of (i, j)
//第i束花放在第j号花瓶中的美观度
char	av[MAXN][MAXN];
//dp[i][j]表示以i号花为右边界且i插在j号花瓶中的序列的最大美观度
//范围为[-5000, 5000],处在short范围内
short	dp[MAXN][MAXN];

int
main() {
	
	int		f, v;//花数和花瓶数
	int		i, j, k;//技术变量
	int		max;//记录最大值的临时变量
	
	scanf("%d%d", &f, &v);
	for ( i = 1; i <= f; i++ )
		for ( j = 1; j <= v; j++ )
			scanf("%d", &av[i][j]);
		
	for ( i = 1; i <= v; i++ )//初始化
		//由于1号花之前没有其它花
		//因此以1为右边界序列的最大美观度就是av[1][j]
		dp[1][i] = (short)av[1][i];

	//由于花必须按顺序排列,因此第i号花摆放的花瓶号j一定满足
	//j ≥ i
	for ( i = 2; i <= f; i++ )
		for ( j = i; j <= v; j++ ) {
				
			for ( max = RINF, k = i - 1; k < j; k++ )
				//挑出以i - 1为右边界的最大序列
				//此时i- 1号花的花瓶的范围一定是[i - 1, j)
				//一定是位于j左边的,因为现在就是假设i号花
				  //插在j号花瓶中
				max = MAX( max, dp[i - 1][k] );
				
			dp[i][j] = max + av[i][j];
		}
			
	for ( max = RINF, i = f; i <= v; i++ )	
		max = MAX( max, dp[f][i] );
		
	printf("%d\n", max);
		
	return 0;
}

无注释代码:

#include <stdio.h>

#define	RINF		-5001

#define	MAXN		101

#define	MAX(x,y)	( (x) > (y) ? (x) : (y) )

char	av[MAXN][MAXN];
short	dp[MAXN][MAXN];

int
main() {

	int		f, v;
	int		i, j, k;
	int		max;

	scanf("%d%d", &f, &v);
	for ( i = 1; i <= f; i++ )
		for ( j = 1; j <= v; j++ )
			scanf("%d", &av[i][j]);

	for ( i = 1; i <= v; i++ )
		dp[1][i] = (short)av[1][i];

	for ( i = 2; i <= f; i++ )
		for ( j = i; j <= v; j++ ) {
		
			for ( max = RINF, k = i - 1; k < j; k++ )
				max = MAX( max, dp[i - 1][k] );

			dp[i][j] = max + av[i][j];
		}

	for ( max = RINF, i = f; i <= v; i++ )	
		max = MAX( max, dp[f][i] );

	printf("%d\n", max);

	return 0;
}

单词解释:

pleasant:adj, 令人愉悦的,令人舒适的

bunch:n, 花束,串

a bunch of flower:一束花

vase:n, 花瓶

glue:n, 胶水; vt, 粘合

shelf:n, 架子

moveable:adj, 可移动的

significance:n, 意义,重要性

azalea:n, 杜鹃花

begonia:n, 秋海棠

carnation:n, 康乃馨

excess:n, 超过,额外

aesthetic:adj, 美的,美学的

characteristic:n, 特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值