目录
吃零食题目
题目背景:
话说干啥啥不行,吃饭第一名,小明就是这样的人。
题目描述:
封控在家,零食紧缺,小明看着家里仅剩的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)