【動的計画法】JuntouJunの新ゲーム

余暇には、スアントウさんが同僚を連れてゲームをすることがよくあります。スアントウさんは最近、楽しい新しいゲームを発明しました。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;
} 

おすすめ

転載: blog.csdn.net/qq_43531919/article/details/115043038