蒜头君的新游戏
这题用用递归很简单,但是会运行超时,用dp看不太懂.
以下市是递归。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<math.h> 5 #include<cstdio> 6 using namespace std; 7 int ccount = 0; 8 void q(int current, int m ,int n) 9 { 10 if(m==0&¤t==0) 11 ccount++; 12 if(m>0) 13 { 14 q((current+n-1)%n,m-1,n); 15 q((current+n+1)%n,m-1,n); 16 } 17 } 18 int main() 19 { 20 int n,m; 21 cin>>n>>m; 22 q(0,m,n); 23 cout<<ccount<<endl; 24 return 0; 25 26 }
以下是dp,看不太懂。话说任何dp问题都可以转化为递归是吧,dp的存在就是为了简化递归?
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<math.h> 5 #include<cstdio> 6 using namespace std; 7 int ccount = 0; 8 void q(int current, int m ,int n) 9 { 10 if(m==0&¤t==0) 11 ccount++; 12 if(m>0) 13 { 14 q((current+n-1)%n,m-1,n); 15 q((current+n+1)%n,m-1,n); 16 } 17 } 18 int main() 19 { 20 // int n,m; 21 // cin>>n>>m; 22 // q(0,m,n); 23 // cout<<ccount<<endl; 24 int m,n; 25 cin>>n>>m; 26 int f[35][35]; 27 memset(f,0,sizeof(f)); 28 f[0][1]=1; 29 for(int i =1;i<=m;i++ ) 30 for(int j=1;j<=n;j++) 31 { 32 if(j==1) 33 { 34 f[i][j] = f[i-1][2]+f[i-1][n]; 35 }else if(j==n) 36 { 37 f[i][j]=f[i-1][1]+f[i-1][n-1]; 38 }else 39 { 40 f[i][j]=f[i-1][j-1]+f[i-1][j+1]; 41 } 42 } 43 cout<<f[m][1]<<endl; 44 return 0; 45 46 }