P1057 传球游戏
这道题是水题了吧,可惜我之前还是写错了。 这是我后来做这道题的草稿: 设 \(dp[i][j]\) 为球在 \(i\) 手上,还需传 \(j\) 次的方案数,那么,状态转移方程就是: \[dp[i][j] = dp[i + 1][j - 1] + dp[i - 1][j - 1]\] 当然要特殊考虑 \(i==1\) 和 \(n\) 的情况。 最后答案就是 \(dp[1][m]\) ,注意不要输错了。 不会递推,只会记忆化。 代码: #include<cstdio> #include<cstring> const int maxn = 40 ; int dp[maxn][maxn]; int n, m; int solve( int i, int j) { if (dp[i][j] != -1 ) return dp[i][j]; int ans = 0 ; if (j == 0 ) { if (i == 1 ) ans = 1 ; } else if (i == 1 ) { ans = solve( 2 , j - 1 ) + solve(n, j - 1 ); } else if (i == n) { ans = solve(n - 1 , j - 1 ) + solve( 1 , j - 1 ); } else { ans = solve(i + 1 , j - 1 ) +