问题描述:

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

算法内容:

   

#include <iostream>

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<<num;
}

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

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

   借鉴的代码如下:

#include <iostream>
#include <vector>

using namespace std;

int cal(int n,int m){
vector<vector<int>> dp(m,vector<int>(n,0));
dp[0][1] =1; dp[0][n-1]=1;
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
dp[i][j] = dp[i-1][(j-1+n)%n]+dp[i-1][(j+1)%n];
}
}
return dp[m-1][0];
}
int main(){
int n,m;
cin>>n>>m;
cout<< cal(n,m);

}

  理解如下:

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

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

基本算法练习——击鼓传花_递归