题解 P1057 【传球游戏】

小学奥数中的传球法解题~~~

首先来讲一下思路:这种题最适合画树形图,类似于一棵二叉树;

但是貌似画不完那么大一棵树!!!

So,我们想到了列表(其实是老师讲的

或者叫DP

表中,a[ i ][ j ]表示第i次传球传到编号为j的仁兄的方法数,而a[ i ][ j ]则是由a[ j-1 ][ i-1 ]和a[ j+1 ][ i-1 ]传递来的(注意边缘情况)。

DP转移方程就是:

\(a_{j,i}=a_{j-1,i-1}+a_{j+1,i-1}\)

特地的,

当\(j=1\)的时候,\(a_{1,i}=a_{n,i-1}+a_{2,i-1}\)

而当\(j=n\)时,\(a_{n,i}=a_{1,i-1}+a_{n-1,i-1}\)

上代码!

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,m;
  cin>>n>>m;
  int a[n+1][m+1];
  memset(a,0,sizeof(a));
  a[1][0]=1;
  for(int i=1;i<=m;i++)
  {
    a[1][i]=a[n][i-1]+a[2][i-1];
    for(int j=2;j<n;j++) 
        a[j][i]=a[j-1][i-1]+a[j+1][i-1];
    a[n][i]=a[1][i-1]+a[n-1][i-1];
  }
  cout<<a[1][m];
  return 0;
}

2020/2/6 初一的宋长纬已修改

上一篇:POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量


下一篇:memset与初始化