题目不算很难,dp的转移方程也很容易列出:
设dp[i][j] 代表第i次传球之后球回到j手中的传球数。易得:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j-1] 再处理一下头头尾尾即可。
1 #include <iostream> 2 #include <memory.h> 3 using namespace std; 4 int dp[32][32]; 5 int main() 6 { 7 int n,m; 8 while(cin >> n >> m) 9 { 10 memset(dp,0,sizeof(dp)); 11 int i,j; 12 dp[1][n] = 1; 13 dp[1][2] = 1; 14 for(i = 2;i <= m;i++) 15 { 16 for(j = 1;j <= n;j++) 17 { 18 if(j == 1) 19 dp[i][j] = dp[i-1][j+1] + dp[i-1][n]; 20 else if(j == n) 21 dp[i][j] = dp[i-1][j - 1] + dp[i-1][1]; 22 else 23 dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]; 24 } 25 } 26 cout << dp[m][1] << endl; 27 } 28 return 0; 29 }