题解:P1044 [NOIP 2003 普及组] 栈
看题解里好多巨佬呢,都是卡特兰数,本蒟蒻来发一篇递推的吧。
我的思想主要是将他从最终序列倒退回去。
SOLUTION
我们首先定义 DP 状态
我们首先给出一个初始化,如果此时没有元素需要入栈,那么只有一种情况,这是很容易理解的。
接下来就是转移方程了,我们分为两种情况讨论。
第一种是栈内还有元素,那我们可以选择出栈和入栈,将这两种情况的方案数相加即可。
第二种是没有元素了,只能选择入栈。
看到这的小伙伴应该已经有了想法,但如果还没有懂,那么就请看下面的代码。
CODE
#include<bits/stdc++.h>
using namespace std;
int dp[25][25] , n;
int main(){
cin >> n;
for(int i = 0;i <= n;i++)dp[0][i] = 1;//初始化
for(int i = 1;i <= n;i++){
for(int j = 0;j <= n;j++){
if(j)dp[i][j] = dp[i][j - 1] + dp[i - 1][j + 1];//栈中有元素
else dp[i][j] = dp[i - 1][j + 1];//栈中无元素
}
}
cout << dp[n][0];
return 0;
}