不得不说MySoul确实很聪明,有算法思维,我写这道题就是纯数学思维插空法,惭愧。
以下是题目
MySoul的解题思路:
第一位可以取1到K-1,第二位到最后一位不能连续地取0,如果前一位取0,则后一位只能取1到K-1,如果前一位取1到K-1,使用递归求解。
MySoul的代码:
#include<iostream>
using namespace std;
int k,n;long long sum;
void dfs(int step,bool t,long long tot)
{
if(step==n-1)
{
sum+=tot;
return;
}
if(t==1)//前一位没有取0,则这一位可以取0.
{
dfs(step+1,0,tot);
}
dfs(step+1,1,tot*(k-1));
return;
}
int main()
{
cin>>n>>k;
dfs(0,1,k-1);//第一位可以取1到K-1.
cout<<sum;
}
从第一位到第N位,寻找所有可行的数字,这也像是一个深搜,每一位数就是一层。深搜和递归本就千丝万缕。
step指步数,确定完一位数就是走了一步,因为第一步是确定的,从1取到K-1,所以dfs()算剩下的n-1步。
step==n-1就是递归的终点,各个递归过去的系统栈都开始回退出结果。sum把各种结果都加起来就得到最终答案。