蒜头君的新游戏

这题用用递归很简单,但是会运行超时,用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&&current==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&&current==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 } 
View Code

 

posted @ 2020-02-07 17:08  caxi  阅读(312)  评论(1编辑  收藏  举报