题目链接: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
