题目:http://acm.hdu.edu.cn/showproblem.php?pid=2709
AC代码(C++):
#include <iostream> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; int n; int dp[1000005]; int main() { while (cin >> n) { dp[0] = 1; for (int i = 1; i <= n; i++) { if (i % 2 != 0)dp[i] = dp[i - 1]; else dp[i] = (dp[i - 2] + dp[i / 2]) % 1000000000; } cout << dp[n] << endl; } //system("pause"); }总结: 递推? 找规律? 当i为奇数时dp[i]就等于dp[i-1], 因为就相当于在其所有表达式前加了个1, 并不能组合出新的表达式. 当i为偶数时, 可以将其所有表达式分成两种, 有1的和没1的. 有1的表达式数量就等于dp[i-2], 因为去掉表达式前面的两个1就得到了i-2的所有表达式. 没1的表达式, 除以2会发现得到了i/2的所有表达式. 所以i为偶数时dp[i]=dp[i-2]+dp[i/2].