看见这一题的时候,第一反应就是dp,但是想了半小时也没有想到怎么dp,于是打表,先用dfs把前几个求出来看看。代码如下:
void dfs(int n,int m) //一共两行,n代表上面一行剩余,m代表下面一行剩余
{
if(n<0||m<0) //说明超过长度啦
return ;
else if(n==0&&m==0) //满足条件
{ ans++;
return ;}
if(n==m) //n==m的时候只有下面四种情况
{ dfs(n-1,m-1);
dfs(n-2,m-0);
// dfs(n-0,m-2); //这个与上一行那种情况重负
dfs(n-2,m-1);
dfs(n-1,m-2);}
else if(n-m==1)
{ dfs(n-2,m);
dfs(n-2,m-1);}
else if(m-n==1)
{ dfs(n,m-2);
dfs(n-1,m-2);}
// else if(n-m>=2)
// dfs(n-2,m);
else if(m-n>=2)
dfs(n,m-2);
return ;
}
得到前几个结果
然后就就推公式,别说还真让我找到了:
dp[i]=2*dp[i-1]+dp[i-3];
然后就简单了,dp就完了
但是直到现在也不知道为什么是这个公式,有没有大佬解惑啊