问题 D: 聪明的美食家

本文介绍了一个基于动态规划算法解决的问题——如何在一个美食街上选择食物序列,使得吃的爽的次数最多。该问题通过寻找最长递增子序列来实现,具体算法包括初始化DP数组,通过两层循环比较每种食物的美味度并更新DP数组。
摘要由CSDN通过智能技术生成

题目描述

如果有人认为吃东西只需要嘴巴,那就错了。
都知道舌头有这么一个特性,“由简入奢易,由奢如简难”(据好事者考究,此规律也适合许多其他情况)。具体而言,如果是甜食,当你吃的食物不如前面刚吃过的东西甜,就很不爽了。
大宝是一个聪明的美食家,当然深谙此道。一次他来到某小吃一条街,准备从街的一头吃到另一头。为了吃得爽,他大费周章,得到了各种食物的“美味度”。他拒绝不爽的经历,不走回头路而且还要爽歪歪(爽的次数尽量多)。

输入

两行数据。
第一行为一个整数n,表示小吃街上小吃的数量

第二行为n个整数,分别表示n种食物的“美味度”

数据规模和约定
美味度为0到100的整数
n< 1000

输出

一个整数,表示吃得爽的次数

样例输入

10
3  18  7  14  10  12  23  41  16  24 

样例输出

6

应该是一个动态规划题,找出简易方程即可

代码:

# include <stdio.h>

int main(void)
{
	int a[1001], dp[1001];
	int n, i, j;
	while (~ scanf("%d", &n))
	{
		for (i = 1; i <= n; i ++)
			scanf("%d", &a[i]);
		int min = 1;
		for (i = 1; i <= n; i ++)
			dp[i] = 1; // 初始值为1, 最长的为自己本身
		for (i = 1; i <= n; i ++)
		{
			for (j = 1; j < i; j ++)
			{
				if (a[j] <= a[i])  //  “不如” 说明可以相等, 加个等号 与之前的相比
				{
					if (dp[i] <= dp[j]+1)   // 如果此刻的位置比之前加1小的话 更新值。
						dp[i] = dp[j]+1;	
					if (dp[i] > min)   // 更新最小值。
						min = dp[i];
				}	
			}
		}	
		printf("%d\n", min);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值