题目:
思路:
一看,计数的
先考虑一下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; }