解题思路
提示里说这是一个dp问题。建一个二维数组,令dp[i][j]表示前i位中第i位的数为j的方案数,状态转移方程为dp[i][j]=dp[i-1][p](p为不与j相邻的任意数)。最后的所求结果为dp[l][i:0–k-1],即前l位以0到k-1为最后一位数的所有方案数之和。
代码
#include<iostream>
using namespace std;
#define mod 1000000007;
long long dp[105][105];
int main()
{
int k,l;
long long sum;
while(cin>>k>>l)
{
sum=0;
for(int i=0;i<k;i++)
{
if(i==0)
dp[1][i]=0;
else
dp[1][i]=1;
}
for(int i=2;i<=l;i++)
for(int j=0;j<k;j++)
for(int p=0;p<k;p++)
{
if((p!=j+1)&&(p!=j-1))
{
dp[i][j]+=dp[i-1][p];
dp[i][j]%=mod;
}
}
for(int i=0;i<k;i++)
{
sum+=dp[l][i];
sum%=mod;
}
cout<<sum<<endl;
}
return 0;
}