序列计数(记忆化搜索)(C++)

【问题描述】
小明想知道,满足以下条件的正整数序列的数量:

  1. 第一项为 n;
  2. 第二项不超过 n;
  3. 从第三项开始,每一项小于前两项的差的绝对值。

请计算,对于给定的 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;
}

猜你喜欢

转载自blog.csdn.net/qq_39592312/article/details/107428501