依然在努力学动规中。

这道题 一开始只想到了递归思路,甚至想到了爬楼梯、斐波那契,都是递归的思路,但我只想到了枚举m的次数,并没有更深一层想到去看传到每个人的方法数,最后看答案明白了,但其实循环嵌套 我想错了。循环我一开始嵌套反了,导致答案都为0。 以下是注解代码,其实就是上面大佬们的思路。

#include<algorithm>
using namespace std;
typedef long long ll;
int n,m;
struct cmp{
	bool operator()(const int&a,const int&b) const{
		return a>b;
	}
};
int dp[40][40];
int main(){
 	cin >> n>>m;
    dp[1][0] =1;
    for(int j = 1;j<=m;j++){//先从一次开始自底向上
        for(int i =1;i<=n;i++){//自底向上 查看分别从一传到i  对dp[i][j]进行赋值
            if(i == 1) dp[i][j]=dp[i+1][j-1]+dp[n][j-1];//对第一个进行判断 从最后一个传来
            //从第二个传来
            else if(i == n) dp[i][j]=dp[1][j-1]+dp[i-1][j-1];//对最后一个进行判断 从第一个传来
            //从倒数第二个传来
            else dp[i][j] = dp[i+1][j-1]+dp[i-1][j-1];//一般情况  要么左边传要么右边传
        }
    }
    cout <<dp[1][m];
    return 0;
}