【问题描述】
小明想知道,满足以下条件的正整数序列的数量:
- 第一项为 n;
- 第二项不超过 n;
- 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种满足条件的序列。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
【样例输入】
4
【样例输出】
7
【样例说明】
以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
【评测用例规模与约定】
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 1000。
参考代码
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
int N;
int date[1005][1005];
int dfs(int a,int b,int ab)
{
if(date[a][b]!=0)
return date[a][b];
if(a<=0||b<=0)
return 0;
//cout << a << " " << b <<endl;
date[a][b] += dfs(a,b-1,abs(a-b+1)) + dfs(b,abs(a-b)-1,abs(b - abs(a-b) + 1)) + 1;
date[a][b] %= 10000;
}
void print()
{
for(int i = 1;i<=N;i++)
{
for(int j = 1;j<=N;j++)
{
printf("%-4d",date[i][j]);
}
cout << endl;
}
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","r",stdout);
cin >> N;
cout << dfs(N,N,abs(N-N));
//print();
return 0;
}