1 solutions

  • -1
    @ 2024-6-5 15:14:27

    搜索(2^n)

    依次枚举每个球的左右掉落

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int dfs(int u,int s)
    {
    	if(s==0)
    	{
    		return u==1?1:0;
    	}
    	int cnt=0;
    	int left=(u==1)?n:u-1; //左边
    	cnt+=dfs(left,s-1);
    	int right=(u==n)?1:u+1; //右边
    	cnt+=dfs(right,s-1);
    	return cnt;
    }
    int main()
    {
    	cin>>n>>m;
    	cout<<dfs(n,m);
    	return 0;
    }
    

    动态规划(OnmOnm)

    状态表示f[i][j]f[i][j]表示第ii轮的时候球在第jj个人 的方案数,f[i][j]=f[i1][j1]+f[i1][j+1]f[i][j]=f[i-1][j-1]+f[i-1][j+1]需要注意边界。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=33;
    int f[N][N]; //f[i][j]表示第i次传球的时候,球在第j个人的方案数
    int n,m;
    int main()
    {
    	cin>>n>>m;
    	f[0][0]=1; //起点
    	for(int i=1;i<=m;i++) //枚举轮
    	{ 
    		for(int j=0;j<n;j++) //枚举每个人
    		{
    			f[i][j]=f[i-1][(j+1)%n]+f[i-1][(j+n-1)%n];
    			//     当j==n-1时(j+1)%n==0 同理当j==0,时(j+n-1)%n=n-1,处理相邻
    		}
    	}
    	cout<<f[m][0]<<endl; //传了m次,最后球在0号点
    	return 0;
    }
    
    • 1

    Information

    ID
    423
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    6
    Tags
    # Submissions
    25
    Accepted
    10
    Uploaded By