题目解释
题目说的可能有一点点歧义
解释一下就是,给定了一个自然数N
可以进行三种操作
1.不操作
2.将一个小于等于N/2的自然数X加到N的左边
3.以新加的自然数X为基准,取一个自然数Y<=X/2,加在XN(2操作做完后的新数)左侧,是它成为YXN以此类推;
思路
很经典的递推
写出方程的话就是
ans(0)=1;
ans(n)=ans(0)+ans(k);(k=1,2...n/2(向下取整))
代码
int cc[1005]; int main() { int n; cin >> n; cc[0] = 1; for (int i = 1; i <= 1000; i++) { int sum = 0; for (int j = 1; j <= i / 2; j++) { sum += cc[j]; } cc[i] = cc[0] + sum; } cout << cc[n]; return 0; }
如果不理解原理,可以自己写一下,推一下。模拟一下递推的过程就知道了。
tips:n>=4时,将第一次加的数相同的结果写在一起,比较好看出规律.
例:
n=1
1
n=2
2
12
n=3
3
13
n=4
14
24
124 //很明显,对于这两行,将尾部的4去掉,就是n=2时的结果.
4