整数拆分

整数拆分

http://www.nowcoder.com/questionTerminal/376537f4609a49d296901db5139639ec

思路

对于一个数字 n,如果 n 是奇数,那么 n 的所有组合方式中一定包含一个 1,那么它和 n-1 的组合方式种数相同,dp[n] = dp[n-1];

如果 n 是偶数,那么它的组合方式中可能有 1,也可能没有 1,有 1 的组合方式有 dp[n - 1] 种,没有 1 的组合方式有 dp[n/2] 种,因为偶数组合方式除以 2 后的组合方式其实是一样的,dp[n] = dp[n-1] + dp[n/2]

#include <iostream>
using namespace std;

#define mod 1000000000
int dp[1000001];

long f2n(long n){
    dp[1] = 1;
    for (long i = 2; i <= n; i++){
        if (i % 2)
            dp[i] = dp[i - 1];
        else
            dp[i] = (dp[i - 1] + dp[i / 2]) % mod;
    }
    return dp[n];
}

int main(){
    int n;
    while (cin >> n) {
        cout << f2n(n) << endl;
    }
    return 0;
}
算法题解 文章被收录于专栏

不定期更新一些算法题解,有什么问题可以随时留言~

全部评论
您好请问一下为什么要%1000000000呀
点赞
送花
回复
分享
发布于 2023-02-10 11:38 广东
没有 1 的组合方式有 dp[n/2] 种,因为偶数组合方式除以 2 后的组合方式其实是一样的,dp[n] = dp[n-1] + dp[n/2] 说的好啊,一下子就明白了
点赞
送花
回复
分享
发布于 02-03 22:45 新疆
网易互娱
校招火热招聘中
官网直投

相关推荐

6 1 评论
分享
牛客网
牛客企业服务