【洛谷】P1057 [NOIP2008 普及组] 传球游戏

核心dp思路:

我们可以发现,任何一个位置都只能从左边和右边传过来,那么他只能从他左边和他右边的同学手上接到球,那球传到他手上的路径数就是球传到他左边同学的路径数与球传到他右边同学的路径数之和。

即:

dp[i][j]=dp[i-1][j+1]+dp[i-1][j-1];

okk!

上ACcode:

#include
using namespace std;
#define int long long
const int N=35;
int n,m,dp[N][N];
void solve() {
  cin>>n>>m;
  //一号为是小蛮 
  dp[0][1]=1;//初始化,dp经典
   
  for(int i=1;i<=m;i++)//m次传球
  for(int j=1;j<=n;j++){//n个人 
  
  	if(j==1) dp[i][j]=dp[i-1][j+1]+dp[i-1][n];//两个特殊点 
	else if(j==n) dp[i][j]=dp[i-1][j-1]+dp[i-1][1]; //两个特殊点 
	else dp[i][j]=dp[i-1][j+1]+dp[i-1][j-1];//*****核心 
  } 
  cout<>tt;
	while(tt--) {
		solve();
	}
	return 0;
}








over~

你可能感兴趣的:(c++,算法,dp)