鹿我所录的博客

记录我在学习C#中的点点滴滴,记录下以备后来人借鉴。

 

洛谷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\n",DP[m][1]);
    return 0;
}

 

posted on 2020-10-18 21:43  鹿我所录  阅读(109)  评论(0编辑  收藏  举报

导航