题意分析
状态设计:
dp[i][j]dp[i][j] 表示传递i次传到j位置的方案总数
状态转移:
dp[i][j−1]+=dp[i][j]dp[i][j−1]+=dp[i][j]
dp[i][j+1]+=dp[i][j]dp[i][j+1]+=dp[i][j]
初始状态
dp[0][1]=1dp[0][1]=1
代码总览
#include<bits/stdc++.h>
using namespace std;
const int nmax = 50;
int dp[nmax][nmax];
int n,m;
int get(int x){
if(x<1) return x+n;
if(x>n) return x-n;
else return x;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
memset(dp,0,sizeof dp);
dp[0][1] = 1;
for(int i = 0;i<=m;++i){
for(int j = 1;j<=n;++j){
dp[i+1][get(j+1)] += dp[i][j];
dp[i+1][get(j-1)] += dp[i][j];
}
}
printf("%d\n",dp[m][1]);
}
return 0;
}
本文详细解析了一个关于传球路径总数的动态规划问题。通过定义dp[i][j]为第i次传球到达位置j的方案总数,利用递推公式dp[i][j±1]+=dp[i][j]完成状态转移。代码实现采用C++,并考虑了边界情况。
819

被折叠的 条评论
为什么被折叠?



