POJ 2229 Sumsets(递推,思考)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2229 Sumsets(递推,思考)相关的知识,希望对你有一定的参考价值。
/*
n = 7
1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4
*/
/*
若i为偶数 : 若有 1 ,至少有两个 ---->f[i-2]的情况+两个1,
若没有1 , 将偶数分解/2-----> f[i/2];
则dp[i] = dp[i / 2] + dp[i-2]
若i为奇数: 必定有 1,
dp[i] = 减去1的序列,加上1
则dp[i] = dp[i – 1]
*/
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 5 #include<string> 6 #include<vector> 7 #include<set> 8 #include<map> 9 #include<queue> 10 #include<math.h> 11 12 #include<algorithm> 13 #include<iostream> 14 15 const int INF = 0x7f7f7f7f; 16 using namespace std; 17 typedef long long ll; 18 19 int dp[1000005]; 20 int main(){ 21 22 /* 23 若i为偶数 : 若有 1 ,至少有两个 ---->f[i-2]的情况+两个1, 24 若没有1 , 将偶数分解/2-----> f[i/2]; 25 则dp[i] = dp[i / 2] + dp[i-2] 26 27 若i为奇数: 必定有 1, 28 dp[i] = 减去1的序列,加上1 29 则dp[i] = dp[i – 1] 30 */ 31 int n; 32 dp[0] = 0; 33 dp[1] = 1; 34 dp[2] = 2; 35 for(int i = 3 ; i <= 1000000 ; i ++){ 36 if(i&1) dp[i] = dp[i-1]%1000000000; 37 else dp[i] = (dp[i-2]+dp[i/2])%1000000000; 38 } 39 while(scanf("%d",&n) != EOF && n){ 40 printf("%d\n",dp[n]%1000000000); 41 } 42 43 return 0; 44 }
以上是关于POJ 2229 Sumsets(递推,思考)的主要内容,如果未能解决你的问题,请参考以下文章