题目的图在书上 ……不能拍。
手动画一个。
有点绕……
设定:
- 这道题的思路是反推。
- 将
f[i][0]
定义为1;
当所有要输出的数都在栈里了,那么输出顺序是固定的一种可能;
那么可以这样一步步倒推回到f[n][n]
,也就是原始状态。f[i][j]
代表还有i
个数没有输出,其中有j
个数在未输入的数列里面;
可以推出:f[i][j]
由f[i - 1][j]
与f[i][j - 1]
转移过来;
f[i - 1][j]
代表输出操作;
f[i][j -1 ]
代表入栈操作。为什么要这么设定?
这样构造出来的式子容易写。
枚举的时候是根据式子来的,当前状态是由已知状态转移来的。
这道题不是有两个操作嘛,入栈和输出;
根据这两个操作写出合适的状态转移方程。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 40, M = 40;
ll f[N][M];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i ++) {
f[i][0] = 1;
for(int j = 1; j <= i; j ++)
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
cout << f[n][n];
return 0;
}