2021-02-23:给定一个正数n,求n的裂开方法数。规定:后面的数不能比前面的数小 。比如4的裂开方法有: 1+1+1+1、1+1+2、1+3、2+2、4,5种,所以返回5。
2021-02-23:给定一个正数n,求n的裂开方法数。规定:后面的数不能比前面的数小 。比如4的裂开方法有: 1+1+1+1、1+1+2、1+3、2+2、4,5种,所以返回5。
福哥答案2021-02-23:
自然智慧即可。
1.递归。有代码。
2.动态规划。dp是二维数组。有代码。
3.动态规划,空间压缩。两个一维数组搞定。有代码。
代码用golang编写,代码如下:
package main
import "fmt"
func main() {
for i := 20; i < 40; i++ {
fmt.Println(i, GetWays1(i), GetWays2(i), GetWays3(i))
}
}
//1.递归
func GetWays1(n int) int {
if n <= 0 {
return 0
}
if n == 1 {
return 1
}
return process1(1, n)
}
func process1(startMax int, rest int) int {
if rest == 0 {
return 1
}
ans := 0
for i := startMax; i <= rest; i++ {
ans += process1(i, rest-i)
}
return ans
}
//2.动态规划
func GetWays2(n int) int {
if n <= 0 {
return 0
}
if n == 1 {
return 1
}
dp := make([][]int, n+1)
for i := 0; i < n+1; i++ {
dp[i] = make([]int, n+1)
}
for i := 1; i <= n; i++ {
dp[i][0] = 1
dp[i][i] = 1
}
for startMax := n - 1; startMax >= 1; startMax-- {
for rest := startMax + 1; rest <= n; rest++ {
dp[startMax][rest] = dp[startMax][rest-startMax] + dp[startMax+1][rest]
}
}
return dp[1][n]
}
//3.动态规划,空间压缩
func GetWays3(n int) int {
if n <= 0 {
return 0
}
if n == 1 {
return 1
}
dp := make([][]int, 2)
for i := 0; i < 2; i++ {
dp[i] = make([]int, n+1)
}
dp[1][0] = 1
dp[1][n] = 1
for startMax := n - 1; startMax >= 1; startMax-- {
dp[0][startMax] = 1
dp[0][0] = 1
for rest := startMax + 1; rest <= n; rest++ {
dp[0][rest] = dp[0][rest-startMax] + dp[1][rest]
}
dp[1], dp[0] = dp[0], dp[1]
}
return dp[1][n]
}
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具