九度OJ 1547 动态规划

    xiaoxiao2025-10-25  10

    题目链接:http://ac.jobdu.com/problem.php?pid=1547

    题目描述:

    给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈。 要求在操作序列的执行过程中不会出现非法的操作,即不会在空栈时执行出栈操作,同时保证当操作序列完成后,栈恰好为一个空栈。 求符合条件的操作序列种类。 例如,4个操作组成的操作序列符合条件的如下: 入栈,出栈,入栈,出栈 入栈,入栈,出栈,出栈 共2种。

    输入:

    输入包含多组测试用例,每组测试用例仅包含一个整数n(1<=n<=1000)。

    输出:

    输出仅一个整数,表示符合条件的序列总数,为了防止总数过多超出int的范围,结果对1000000007取模(mod 1000000007)。

    样例输入: 2 4 10 样例输出: 1 2 42

    解答思路 :

    dp(i,j)表示 i个操作之后,栈里面的数据个数

    状态转移 dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])

    代码:

    #include <bits/stdc++.h> using namespace std; int dp[1001][1001]; int main(){ dp[2][0] = 1; dp[2][1] = 0; dp[2][2] = 1; for (int i = 3 ; i<1001 ; i++){ for (int j = 1 ; j < i ; j++){ dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])%1000000007; } dp[i][0] = dp[i-1][1]; dp[i][i] = dp[i-1][i-1]; } int n ; while (cin>>n){ cout<<dp[n][0]<<endl; } return 0; }

    下面是问题1547第1583430号解答的执行结果:一共5个案例,通过5

    测试案例 结果    内存 耗时 得分/满分 1 Accepted 5432 kb 10 ms 20/20 2 Accepted 5432 kb 10 ms 20/20 3 Accepted 5432 kb 10 ms 20/20 4 Accepted 5432 kb 10 ms 20/20 5 Accepted 5432 kb 10 ms 20/20

    转载请注明原文地址: https://ju.6miu.com/read-1303510.html
    最新回复(0)