DP 之 poj 2229

//  [3/24/2014 Sjm]
/*
解法分析:
依次列出 N=1, 2, 3, 4, 5, 6, 7, 寻找规律:
(1) 若 n 为奇数:dp[n] = dp[n - 1] (第一个数必是1, 将第一个数去掉, 其所剩个数 即 dp[n-1])
(2) 若 n 为偶数:
	1) 第一个数字为1,将第一个数去掉, 其所剩个数 即 dp[n-1]
	2)第一个数为偶数(所有的这一排数均为偶数), 将2提出去,即可得 dp[n>>1]
	两者加和,即为答案。
*/
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <vector>
 5 using namespace std;
 6 const int Mod = 1e9;
 7 int N;
 8 
 9 int Solve()
10 {
11     vector<int> dp(N+1);
12     dp[1] = 1; 
13     for (int i = 2; i <= N; i++){
14         if (i & 1) dp[i] = dp[i - 1];
15         else dp[i] = (dp[i - 1] + dp[i >> 1]) % Mod;
16     }
17     return dp[N];
18 }
19 
20 int main()
21 {
22     //freopen("input.txt", "r", stdin);
23     //freopen("output.txt", "w", stdout);
24     while (scanf("%d", &N) != EOF)
25         printf("%d\n", Solve());
26     return 0;
27 }
原文地址:https://www.cnblogs.com/shijianming/p/4140873.html