Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021-02-23:给定一个正数n,求n的裂开方法数。

2021-02-23:给定一个正数n,求n的裂开方法数。

原创
作者头像
福大大架构师每日一题
修改于 2021-02-24 02:03:22
修改于 2021-02-24 02:03:22
3680
举报

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编写,代码如下:

代码语言:txt
AI代码解释
复制
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]

}

执行结果如下:

图片
图片

左神java代码

评论

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个)。如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到 N-1 位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走 K 步,最终能来到P位置(P也是1~N中的一个)的方法有多少种?给定四个参数 N、M、K、P,返回方法数。
福大大架构师每日一题
2021/02/14
4980
2020-02-24:arr是面值数组,其中的值都是正数且没有重复
福哥答案2020-02-24: 自然智慧即可。 1.递归。有代码。 2.动态规划。dp是二维数组。有代码。 代码用golang编写,代码如下: package main import ( "fmt" ) func main() { arr := []int{1, 2, 3} aim := 8 ret := minCoins1(arr, aim) fmt.Println("1.递归:", ret) ret = minCoins2(arr, aim) fmt.
福大大架构师每日一题
2021/02/24
4730
2020-02-24:arr是面值数组,其中的值都是正数且没有重复
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福大大架构师每日一题
2021/02/25
3210
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2022-02-04:组合总和 Ⅳ。 给你一个由 不同 整数组成的数
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
福大大架构师每日一题
2022/02/04
4810
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, a
中间位置i需要达标,达标的条件是 : arri-1 > arri 或者 arri+1 > arri哪个都可以。
福大大架构师每日一题
2022/01/12
3720
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。
福大大架构师每日一题
2021/04/04
9340
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。
福大大架构师每日一题
2021/05/06
5800
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
2021-08-24:合并石头的最低成本。有 N 堆石头排成一排
2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stonesi 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1 。
福大大架构师每日一题
2021/08/24
2640
2021-08-24:合并石头的最低成本。有 N 堆石头排成一排
2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n, 请你找出并返回
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1。
福大大架构师每日一题
2024/04/11
1740
2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n, 请你找出并返回
2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?
福哥答案2021-02-16: 自然智慧即可。 1.普通递归。有代码。 需要判断同列和斜线。 2.位运算递归。有代码。 3.我的递归。有代码。 只需要判断斜线。 代码用golang编写,代码如下: package main import ( "fmt" "time" ) func main() { n := 12 fmt.Println(n, "皇后问题") fmt.Println("------") now := time.Now() fmt.P
福大大架构师每日一题
2021/02/16
3350
2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?
2021-06-16:返回一个数组中,选择的数字不能相邻的情况下, 最大子序列累加和。
2021-06-16:返回一个数组中,选择的数字不能相邻的情况下, 最大子序列累加和。
福大大架构师每日一题
2021/06/16
6790
2021-06-16:返回一个数组中,选择的数字不能相邻的情况下, 最大子序列累加和。
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time,
福大大架构师每日一题
2024/01/05
2190
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。"."匹配单个字符。""匹配左边元素的多个字符。判断p是否匹配s。比如s="ab",p="a.",返回true。比如s="ab",p="a",返回false。比如s="aaa",p="a",返回true。比如s="moonfdd",p="kmoonfdd",返回true,因为"*"表示零个或者多个,这里'k'表示0个。
福大大架构师每日一题
2021/07/02
4720
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符
2021-02-11:如何求出两个字符串的最大公共子序列长度?
举例:"moonfudadayx"和"mfyudadxxax",最大公共子序列是"mfudadax",长度是8。
福大大架构师每日一题
2021/02/11
7260
2021-02-11:如何求出两个字符串的最大公共子序列长度?
2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应
2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一个数字字符串比如"111”就可以转化为:"AAA"、"KA"和"AK"。给定一个只有数字字符组成的字符串str,请问有多少种转化结果?
福大大架构师每日一题
2021/02/17
6180
2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应
2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务 他喜欢 R 字符,因为在某些任务中,这个字符通常表示
现在,塔子哥面临一个问题,他有一个长度为 n 的字符串 s,它仅由 R 和 B 组成
福大大架构师每日一题
2023/09/09
2790
2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务 他喜欢 R 字符,因为在某些任务中,这个字符通常表示
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 R。 获得分数为 L_X_R。 2)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边所有气球都已经被打爆。获得分数为 L_X。 3)如果被打爆气球的左边所有的气球都已经被打爆;如果被打爆气球的右边有没被打爆的 气球,找到离被打爆气球最近的气球,假设分数为 R;如果被打爆气球的右边所有气球都 已经 被打爆。获得分数为 X_R。 4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为 X。目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。【举例】arr = {3,2,5} 如果先打爆3,获得3_2;再打爆2,获得2_5;最后打爆5,获得5;最后总分21 如果先打爆3,获得3_2;再打爆5,获得2_5;最后打爆2,获得2;最后总分18 如果先打爆2,获得3_2_5;再打爆3,获得3_5;最后打爆5,获得5;最后总分50 如果先打爆2,获得3_2_5;再打爆5,获得3_5;最后打爆3,获得3;最后总分48 如果先打爆5,获得2_5;再打爆3,获得3_2;最后打爆2,获得2;最后总分18 如果先打爆5,获得2_5;再打爆2,获得3_2;最后打爆3,获得3;最后总分19 返回能获得的最大分数为50。
福大大架构师每日一题
2021/05/04
3400
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr,每个值表示 居民点的一维坐标,再给定一个正数 num,表示邮局数量。选择num个居民点建立num个 邮局,使所有的居民点到最近邮局的总距离最短,返回最短的总距离。【举例】arr=1,2,3,4,5,1000,num=2。第一个邮局建立在 3 位置,第二个邮局建立在 1000 位置。那么 1 位置到邮局的距离 为 2, 2 位置到邮局距离为 1,3 位置到邮局的距离为 0,4 位置到邮局的距离为 1, 5 位置到邮局的距 离为 2,1000 位置到邮局的距离为 0。这种方案下的总距离为 6, 其他任何方案的总距离都不会 比该方案的总距离更短,所以返回6。
福大大架构师每日一题
2021/05/04
5030
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
方法二、对字符串范围做是否是回文串的dp。dpi=true是i,j范围上是回文串,dpi依赖左下方。消耗O(N**2)的空间。
福大大架构师每日一题
2021/06/08
2340
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a到z编号为0到25编号,
2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,
福大大架构师每日一题
2023/12/14
2370
2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a到z编号为0到25编号,
推荐阅读
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2
4980
2020-02-24:arr是面值数组,其中的值都是正数且没有重复
4730
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
3210
2022-02-04:组合总和 Ⅳ。 给你一个由 不同 整数组成的数
4810
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, a
3720
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
9340
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
5800
2021-08-24:合并石头的最低成本。有 N 堆石头排成一排
2640
2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n, 请你找出并返回
1740
2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?
3350
2021-06-16:返回一个数组中,选择的数字不能相邻的情况下, 最大子序列累加和。
6790
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不
2190
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符
4720
2021-02-11:如何求出两个字符串的最大公共子序列长度?
7260
2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应
6180
2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务 他喜欢 R 字符,因为在某些任务中,这个字符通常表示
2790
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
3400
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr
5030
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
2340
2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a到z编号为0到25编号,
2370
相关推荐
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档