题解
2026-03-31 19:24:19
发布于:浙江
3阅读
0回复
0点赞
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
int d[31][31];
memset(d,0,sizeof(d));
d[0][0]=1;
for(int i=1;i<=m;++i){
for(int j=0;j<n;++j){
int l=(j-1+n)%n;
int r=(j+1)%n;
d[i][j]=d[i-1][l]+d[i-1][r];
}
}
cout<<d[m][0]<<endl;
return 0;
}
问题深度解析
这是一个经典的环形动态规划问题,核心是计算在环形结构中经过固定步数后回到起点的路径数。
核心思路推导
状态定义:设dp[i][j]表示传球i次后,球在第j个同学手中的方法数
初始状态:dp[0][0] = 1(0次传球,球在小蛮手里,只有1种方法)
状态转移:
球可以从左边同学传过来:dp[i][j] += dp[i-1][(j-1+n)%n]
球可以从右边同学传过来:dp[i][j] += dp[i-1][(j+1)%n]
最终结果:dp[m][0](传球m次后回到小蛮手中的方法数)
这里空空如也




有帮助,赞一个