整数拆分dp

整数拆分

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

被动态规划玩儿坏了。。。

首先说明思路:
每一个数都可以拆成2的次幂的形式,2的次幂有(1,2,4,6,8...),其中只包括一个奇数,那就是1。

假设给定一个数N:
1.N是奇数,那么N拆分的时候必定有一个1,因为2的次幂除了1都是偶数,由很多偶数不可能构成奇数。
所以 f(N)=f(N-1)
举例:
5=(1+4)=(1+2+2)=(1+1+1+2)=(1+1+1+1+1) ;一共有四种拆分形式
4=(4) =(2+2) =(1+1+2) = (1+1+1+1) ;一共四种拆分方式


2.N是偶数,那么可以分成两种情况:
2.1 N中拆分出1,N中拆分出1和上边N是奇数的情况一样,即f(N-1)
举例:
4=(4)=(2+2)=(1+1+2)=(1+1+1+1)
3=(1+2)=(1+1+1)
2.2 N中不拆分出1
不拆分出1,即都是偶数,偶数的性质可知,偶数都可以整除2,假如N的和为2m,那么除2之后变成m,但是并不影响f(N)。
举例:
4=(4)=(2+2) 都不包含1

同理,由2.1和2.2两种情况的结果相加得到完整的4的拆分。
也就是说N为偶数的情况就是f(N)=f(N-1)+f(N/2)---------------好看一点儿就是:f(2m)=f(2m-1)+f(m);


#include<iostream>
using namespace std;
int dp[1000001];
int main(){
    int n;
    dp[0]=1;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            if(i%2==0){
                dp[i]=(dp[i-1]+dp[i/2])%1000000000;
            }else{
                dp[i]=dp[i-1]%1000000000;
            }
        }
        cout<<dp[n]<<endl;
    }
    return 0;
}
全部评论
"2的次幂有(1,2,4,6,8...)"有问题吧哈哈
12 回复 分享
发布于 2021-03-16 16:24
**为什么你们都这么猛啊,我看答案都看半天
2 回复 分享
发布于 2023-02-28 23:26 北京
太牛了哥们
1 回复 分享
发布于 2024-08-29 20:35 浙江
想不到啊,我想不到啊,泪目了
1 回复 分享
发布于 2024-05-07 21:08 湖北
能看出N为偶数且不拆1时,f(N/2)=f(N),作者真的太厉害了,点赞!
1 回复 分享
发布于 2022-05-17 20:52
N = 2m1 + 2m2 + ...<=> N/2 = m1 + m2 + ...,即N的偶数分解与N/2的分解方式一一对应,种数相同。 更严格地证明可以用离散的单射满射
点赞 回复 分享
发布于 03-22 02:37 北京
妙啊
点赞 回复 分享
发布于 03-10 12:29 江苏
这题爆搜是不会稳超时?
点赞 回复 分享
发布于 2023-02-26 19:53 河南
不拆分出1转化成dp[i/2]不是很理解,比如6,我拆成4+2不也是没拆出1吗,为啥这种情况不算进去
点赞 回复 分享
发布于 2022-03-11 10:29
为什么要%1000000000
点赞 回复 分享
发布于 2020-04-18 21:11
1. N是奇数 举得栗子中4=(4)=(1+1+1)...... 是不是最后一个1应该变成2? 麻烦解答一下
点赞 回复 分享
发布于 2020-03-03 10:31

相关推荐

Lorn的意义:你这种岗位在中国现在要么牛马天天加班,要么关系户进去好吃好喝,8年时间,真的天翻地覆了,对于资本来说你就说一头体力更好的牛马,哎,退伍没有包分配你真的亏了。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:20
点赞 评论 收藏
分享
评论
96
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务