Description
给定一个初始序列,序列中仅包含一个元素 n(1≤n≤1000)。重复以下步骤:
- 不做任何处理;
- 在序列的最左边插入一个正整数,但是这个正整数不能超过序列当前首元素的一半;
请问通过这样的规则,可以构造出多少个不同的序列。
Input
1 个正整数 n ( n ≤ 1000 )
Output
1 个整数,表示能够生成的序列个数。
Sample Input
6Sample Output
6Hint
当n=6,满足条件的序列为
{6},
{1, 6},
{2, 6},
{1, 2, 6},
{3, 6},
{1, 3, 6}
方法:递归
举一个例子:
当n=6,满足条件的序列为{6},{1, 6},{2, 6},{1, 2, 6},{3, 6},{1, 3, 6}
在6的左边,第一次添加的数字可以是1、2、3 (即1->n/2)
将第一次添加的数字i以及后续的数字视为一组:dp[i]
如dp[1]包括:{1,6}
dp[2] 包括:{2,6}、{1,2,6}
dp[3]包括:{3,6}、{1,3,6}
则dp[6]=dp[1]+dp[2]+dp[3]+1,进而得到状态转移方程
dp[n]=1+dp[1]+dp[2]+dp[3]...+dp[n/2]
#include<iostream>
using namespace std;
int main()
{
//ans=1+dp[1]+dp[2]+dp[3]+...dp[n/2]
int dp[10000];
int n;
cin >> n;
int ans = 1;
for (int i = 1; i <= n / 2; i++)
{
dp[i] = 1;
for (int j = 1; j <= i / 2; j++)
{
dp[i] += dp[j];
}
ans += dp[i];
}
cout << ans;
}