洛谷P1057传球游戏-题解

题目:

思路:

一看,计数的

先考虑一下DP

计数的转移,难度高的一般要经过思考才能得出来

但是难度低的(诸如此道)一般已经在题目中说出来了

重点就在于:

每个同学可以把球传给自己左右的两个同学中的一个(左右任意)

这句话上。

左和右,换成数学表示就是

i-1,i+1

由于题目说是一个环,所以特判一下头尾即可

同时,由于不可能同时传球,所以转移自然是来自于上一维(即上一次)的

转移方程应运而生:

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

特判头尾,

同时由于题目说从1号开始,所以f[1][1]=1

代码:

#include <bits/stdc++.h>
using namespace std;
int n,m;
int DP[35][35];
int main()
{
    scanf("%d %d",&n,&m);
    DP[1][1]=1;
    for(int i=2;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
            if(j==1)
            {
                DP[i][j]=DP[i-1][n]+DP[i-1][2];
            }else if(j==n)
            {
                DP[i][j]=DP[i-1][n-1]+DP[i-1][1];
            }else
                DP[i][j]=DP[i-1][j-1]+DP[i-1][j+1];
        }
    printf("%d
",DP[m][1]);
    return 0;
}
原文地址:https://www.cnblogs.com/lujin49/p/13837325.html