【蓝桥杯模拟赛题目】满足条件的正整数序列(动态规划)

问题描述

​小明想知道,满足以下条件的正整数序列的数量:

  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。

动态规划思路

数组dp[i][j]储存以ij为前缀,能衍生出的子序列的个数。
例如,以41为前缀,可以衍生出411、412两种,再加上41本身就是3种。
递推关系:dp[i][j] = dp[j][1] + … + dp[j][abs(i-j)-1] + 1(ij本身)

#include 
#include 
using namespace std;
const int N = 1001;
vector<vector<int>> dp(N, vector<int>(N, -1));

int countSeq(int first, int second)
{
    if (dp[first][second] != -1)
        return dp[first][second];
    int t = 1;
    for (int i = 1; i < abs(first - second); i++)
    {
        t += countSeq(second, i);
    }
    dp[first][second] = t % 10000;
    return dp[first][second];
}
int main()
{
    int n, ans(0);
    cin >> n;
    dp[1][1] = 1;
    for (int i = 1; i <= n; i++)
    {
        ans = (ans + countSeq(n, i)) % 10000;
    }
    cout << ans << endl;
    return 0;
}

复杂度分析

时间复杂度:O(n^2)
空间复制度:O(n^2),题目给定了n的最大值,可以看作O(1)

你可能感兴趣的:(【蓝桥杯模拟赛题目】满足条件的正整数序列(动态规划))