传球游戏

传球游戏

https://ac.nowcoder.com/acm/problem/16619

根据题意描述,知道状态的转移跟次数m和n有关,初步建立二维dp
读过题意之后dp[ i ][ j ]表示传了j次后到达i的方法数;
因为是个圆形,对于最后一个和第一个判定一下;
初始化dp[ 1 ][ 0 ]=1;
根据状态转移方程,dp[ i ][ j ]=dp[ i-1 ][ j-1 ] + dp[ i+1 ][ j-1 ];
所以在第i个传球j次时,其余数j-1这个状态一定已经计算过;所以外层循环为1~m;

#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int n,m,dp[maxn][maxn];
int main()
{
    cin>>n>>m;
    dp[1][0]=1;
    if(m==1) cout<<0<<endl;
    else{
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(j==1) dp[j][i]=dp[j+1][i-1]+dp[n][i-1];
                else if(j==n) dp[j][i]=dp[j-1][i-1]+dp[1][i-1];
                else{
                    dp[j][i]=dp[j-1][i-1]+dp[j+1][i-1];
                }
            }
        }
       cout<<dp[1][m]<<endl;
    }
}
全部评论

相关推荐

5 收藏 评论
分享
牛客网
牛客企业服务