吃零食题解

本文介绍了如何解决吃零食问题以获取最大满足感。通过暴力枚举和记忆化数组两种方法进行题解,其中记忆化数组方法能有效降低时间复杂度至O(n^2),避免了暴力递归导致的超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目

方法一:暴力枚举 

方法二:记忆化数组!100 points


吃零食题目

题目背景:

话说干啥啥不行,吃饭第一名,小明就是这样的人。

题目描述:

封控在家,零食紧缺,小明看着家里仅剩的n包零食,想出了一种吃法。他将所有零食编号为1……n,并且将它们依次装进一个长长的两边开口的盒子,每天选择从某一端拿出一包零食吃,剩下的第二天再吃。这样,这些零食就可以吃n天啦~ 每包零食都有一个美味度,第i包零食的美味度是Vi。封控期间没有地方买零食,所以越晚吃越有满足感,在第i天吃第j包零食的满足感为i×Vj。 小明希望获得最大的满足感,他来请教你该怎么吃这些零食才行。

输入格式:

第一行一个整数n。 后续n行,第i行一个整数Vi

输出格式:

个整数,表示最大的满足感。

输入样例1:

5

1

3

1

5

2

输出样例1:

43

说明/提示:

一共五包零食,美味度依次是1,3,1,5,2。 按照编号1,5,2,3,4的顺序,获得的满足度为1×1+2×2+3×3+4×1+5×5=43。  

测试点

n≤

分值

1-3

20

5

4

1

5

5-7

2000

16

8-9

10000

16

注:此题为洛谷私人题库,进制转载此题。

U371911 吃零食 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


题解:


方法一:暴力枚举 

每一次操作都有两个选择,并一次次尝试,并求出最大值,由此,我们用递归:

基本操作如上图所示↑。

接着,用递归实现:

可是,很快发现:

30就会超时,当然了,复杂度为O(2^n)!


方法二:记忆化数组!100 points

为什么上个方法会超时呢?

那我们来找一个东西:

假设现在的盒子中有

  2   3   4   6   7

在第一次递归中,会递归到 2   3   4   6 和 3   4   6   7

在第二次递归中,这回分别递归到 2  3  4 和 3  4  6

                               4  6  7 和 3  4  6

……

发现问题了吧!

3  4  6 被递归了两次,如果用一个数组存下来……

话不多说,我们定义一个二维数组:

这样, 我们就可以把逻辑图改成:

接着上程序:

最终,程序圆满成功!复杂度为O(n^2)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值