YbtOJ 递推算法课堂过关 例4 传球游戏【递推(简单DP)】

**题目链接**


思路

这道题主要难点是如何设置动态转移方程的转移方式。
既然是传球,我们不妨设 f [ i ] [ j ] f[i][j] f[i][j] 表示传第 i i i 次球时传到第 j j j 个人手上。
此时动态转移方程就变得异常好推:
i = 0 i=0 i=0 时球还在小蛮手上,所以 f [ 0 ] [ 1 ] = 1 f[0][1]=1 f[0][1]=1
j = n j=n j=n 时球只会从 1 1 1 号人和 n − 1 n-1 n1 号人传来。
其余情况时球就只会从 j − 1 j-1 j1 j + 1 j+1 j+1 号人传来。
最终得到动态转移方程(3个)

C o d e Code Code

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long f[101][101];
long long n,m;
int main()
{
    
    
	cin>>n>>m;
	f[0][1]=1;
	for(int i=1; i<=m; i++)
	 for(int j=1; j<=n; j++)
	  {
    
    
	  	if(j==1)
	  	  f[i][j]=f[i-1][2]+f[i-1][n];
	  	if(j>1&&j!=n)
	  	  f[i][j]=f[i][j]+f[i-1][j-1]+f[i-1][j+1];
	  	if(j==n)
	  	  f[i][j]=f[i-1][1]+f[i-1][n-1];
	  }
	cout<<f[m][1];
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Jackma_mayichao/article/details/111699177