基本算法练习——击鼓传花

 问题描述: 递归问题,注意,不是最优问题。 算法内容: #include using namespace std;int num=0;int length

 问题描述:

    递归问题,注意,不是最优问题

算法内容:

   

#include using namespace std;int num=0;
int length =0;void cal(int n,int m){if(!m){if(n==length){num++;}return; }int l,r;l=(n-1)%length;l=l!=0?l:length;r=(n+1)%length;r=r!=0?r:length;cal(l,m-1);cal(r,m-1);
}int main(){int n,m;cin>>n>>m;length =n;cal(n,m);cout<

   评测通过率60%,超时了。

    尝试了很久对其进行优化,以失败告终。  起源于在于,该递归树的深度没办法减少,或者最多减少一层,且十分复杂,意义不大

   借鉴的代码如下:

#include 
#include using namespace std;int cal(int n,int m){vector> dp(m,vector(n,0));dp[0][1] =1; dp[0][n-1]=1;for(int i=1;i>n>>m;cout<< cal(n,m);}

  理解如下:

        1.使用0,1表示状态,同时,0,1又能够表示叠加的个数

        2.下一层的叠加个数,与上一层的叠加个数有关