余暇には、スアントウさんが同僚を連れてゲームをすることがよくあります。スアントウさんは最近、楽しい新しいゲームを発明しました。n人の同僚が輪を作り、同僚のAがウサギのニーニの人形を手に持っています。スアントゥ氏はゲームの開始を叫びます。人形を手に持っている同僚は誰でも、人形を左または右の生徒に渡すことができます。スアントウ氏がゲームの終了を叫んだら、人形を渡すのをやめます。人形を手にした同僚が敗者です。
数ラウンド遊んだ後、スアントウさんは質問を考えました。同僚Aが人形を渡すには、いくつの方法があり、m回通過した後、同僚Aの手に戻ります。2つの方法で、人形を拾う同僚が異なる場合、または人形を拾う順序が異なる場合、それは異なる方法と見なされます。たとえば、1-> 2-> 3-> 1と1-> 3-> 2-> 1は2つの異なる方法です。
入力フォーマット
行を入力し、2つの整数n、m(3≤n≤30、1≤m≤30)を入力します。これは、合計n人の同僚が一緒にプレイし、合計m個の人形が渡されることを意味します。
出力フォーマット
1行を出力し、整数を出力して、人形を転送するさまざまな方法が合計でいくつあるかを示します。
サンプル入力
3 3
サンプル出力
2
解题过程:
我们需要考虑的是:
1、当前传了几次娃娃了
2、当前娃娃在谁的手上
#include<iostream>
using namespace std;
int dp[35][35];
int main(){
int m,n;
cin>>n>>m;
dp[0][1]=1;
for(int i=1;i<=m;i++){
//轮数
for(int j=1;j<=n;j++){
//当前在哪个人手里
if(j==1){
//如果在第一个人手里,那么上一轮(i-1)在第n个人或者第2个人手上
dp[i][j]=dp[i-1][n]+dp[i-1][2];
}else if(j==n){
//如果在在第n个人手里,那么上一轮(i-1)在第1个人或者第n-1个人手里
dp[i][j]=dp[i-1][1]+dp[i-1][n-1];
}else{
//除掉两端,如果在中间任意一个人手里,那么上一轮(i-1)在第j-1或者j+1人手里
dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
}
}
}
//第m轮到达1号人手里的次数
cout<<dp[m][1]<<endl;
return 0;
}