依然在努力学动规中。
这道题 一开始只想到了递归思路,甚至想到了爬楼梯、斐波那契,都是递归的思路,但我只想到了枚举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;
}