【Python】递推——(yacs)切蛋糕问题

【题目】一个圆型的蛋糕,切 nn 刀后,最多能将蛋糕分成多少块?当 n=3n=3 时,最多可以分成 77 块,如下图:

输入格式
  • 单个整数:表示切割的次数 n。
输出格式
  • 单个整数:表示最多能将蛋糕切成多少份。
数据范围
  • 1≤n≤50001≤n≤5000。

【分析】我们可以列出不同刀数下,蛋糕最多可以被分为多少块

n=0时,蛋糕一整块,蛋糕最多1块

n=1时,蛋糕最多被切分为2块

n=2时,蛋糕最多被切分为4块

n=3时,蛋糕最多被切分为7块

以此类推,切割的关键就在于新的每一刀都尽可能跟之前的所有刀痕相交

故我们可以得出刀数和蛋糕块数的关系,例如n=3时,是在n=2刀的基础上加上了3块,也就是在上一刀的基础上加上n

即可根据已知推出未知,也是【递推】的思想,递推的关键就是得出递推表达式和确定边界条件。

若定义一个函数f,那f(n)表示第n刀切的块数,那么递推表达式即为:

n>=1时,f(n)=f(n-1)+n

边界条件为n=0时,f(0)=1


为了模拟递推,我们可以利用Python中的列表,通过下标来存储每一刀对应的最大块数

# 读取输入
n = int(input())

# 初始化结果数组(其实不需要数组,只需要一个变量来存储结果)
# 但为了模拟过程,我们还是用一个列表来存储每一步的结果(可选)
a = [0] * (n + 1)  # 初始化一个长度为 n+1 的列表,因为 f(n) 需要用到 f(0) 到 f(n)

# 基础条件:没有切割时,蛋糕为一块
a[0] = 1

# 根据公式 f(n) = f(n-1) + n 计算切割后的块数
for i in range(1, n + 1):
    a[i] = a[i - 1] + i

# 输出结果,即切 n 刀后的最大块数
print(a[n])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值