题目:n个人围成一圈传球,传m次,每次传给旁边的人,问从1传m次再回到1的方法数
一看题目,当然是dfs啦(dfs大法好)。。。。50pts
正解DP(不会设状态)
设f[i][j]代表传到第i个人,传了j次的方法数
f[1][0]=1;
注意n和1特殊处理(一个圈)
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define olinr return #define _ 0 #define love_nmr 0 #define DB double inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { x=-x; putchar('-'); } if(x>9) put(x/10); putchar(x%10+'0'); } int n; int m; int ans; int f[50][50]; int main() { n=read(); m=read(); f[1][0]=1; for(int i=1;i<=m;i++) { f[1][i]=f[2][i-1]+f[n][i-1]; for(int j=2;j<=n-1;j++) f[j][i]=f[j+1][i-1]+f[j-1][i-1]; f[n][i]=f[n-1][i-1]+f[1][i-1]; } put(f[1][m]); olinr ~~(0^_^0)+love_nmr; }