码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2229(Sumsets)

时间:2020-03-29 10:26:48      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:close   main   clu   printf   spl   思路   stream   c代码   fine   

题目链接:http://poj.org/problem?id=2229

 

思路:“动态规划”问题

   只需要列三个连续数字N即可发现:1.N为奇数时,f(n)=f(n-1)

                     2.N为偶数时,f(n)=f(n-1)+f(n/2)

                     因为此时N-1为基数,N-1情况的每一行第一个数一定是1,所以加上一个1时,就相当于在前面直接加一个1或者与 “后面” 的1组成2。

 

ac代码:

技术图片
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string.h>
#define MOD 1000000000
int N;
int dp[1000005];

int main(void){    
    int num=1;
    scanf("%d",&N);
    dp[1]=1;
    for(int i=2;i<=N;i++){
        if(i&1==1){
            dp[i]=dp[i-1];
        }else{
            dp[i]=(dp[i-1]+dp[i>>1])%MOD;
            // 此处一定要取模
        }
    }
    printf("%d\n",dp[N]);

    return 0;
}
View Code

有一个小技巧:

按位操作

POJ 2229(Sumsets)

标签:close   main   clu   printf   spl   思路   stream   c代码   fine   

原文地址:https://www.cnblogs.com/jaszzz/p/12590888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!