题目链接:P1057 传球游戏 解题思路:这题要用到环型DP的思路。不妨设小蛮在1号,所有人的编号是 1~n。状态dp[i][j]表示所有已经传了i次球,且最后球在编号是j的小朋友手上的方案。我们可以发现,任何一个位置都只能从左边和右边传过来,那么他只能从他左边和他右边的同学手上接到球,那球传到他手上的路径数是不是球传到他左边同学的路径数与球传到他右边同学的路径数之和?
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];注意:要在n和1的时候特判。 代码:
#include<iostream> using namespace std; const int maxn = 5000; int n, m,dp[maxn][maxn]; int main() { cin >> n >> m; dp[0][1] = 1;//没有传球的方案为1 for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (j == 1) { dp[i][j] = dp[i - 1][2] + dp[i - 1][n]; } else if (j == n) { dp[i][j] = dp[i - 1][1] + dp[i - 1][n - 1]; } else { dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; } } } cout << dp[m][1] << endl; }