#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAX = 105; int n, p, m, t, dp[MAX][MAX]; int main() { while (scanf("%d%d%d%d", &n, &p, &m, &t) != EOF) { memset(dp, 0, sizeof(dp)); //init(); //开始时这里的初始化也有错误,但是对照着前面写的记忆化搜索,一点一点改正了。。。好心酸 *_* dp[0][p] = 1; //之前这里不小心写成了dp[m][p] = 1,果然还是因为我太菜了。。。 for (int i = 1; i <= m; i++) { dp[i][1] = dp[i-1][2]; dp[i][n] = dp[i-1][n-1]; for (int j = n-1; j > 1; j--) { dp[i][j] = dp[i-1][j-1]+dp[i-1][j+1]; } } cout<<dp[m][t]<<endl; } } 嗯。。。由于我dp学得太烂,所以先是用的记忆化搜索写了一遍,结果。。嘛,肯定超时了(超时估计也是因为我记忆化搜索也写得烂。。&_&)。后来又改为了dp才过的。