基本算法练习——击鼓传花
问题描述:
递归问题,注意,不是最优问题。
算法内容:
#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.下一层的叠加个数,与上一层的叠加个数有关。

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
