对于100%的数据,1 <= K,L <= 100。
分析:刚开始我是觉得可以通过全排列出所有情况在筛选掉数字相邻之后来求解本问题的,但我发现,不重复挑选l个数字是一个难点,由于l最大到100,也就是说最多可能需要100+个循环来挑选组合数字。之后,我发现相邻进制之间存在着数据联系,第i位数放置j所得到的所有K好数由i-1进制数的所有K好数之和去除与j相邻的两种情况求得,
按照这种思路,考虑用DP解答。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
long long d[105][105];
const int INF = 1000000007;
long long sum;
int main()
{
int k,l,i,j,t;
cin>>k>>l;
for(j=0;j<k;j++)
d[1][j]=1;
for(i=2;i<=l;i++)
for(j=0;j<k;j++)
for(t=0;t<k;t++)
if(t!=j-1&&t!=j+1)
{
d[i][j]+=d[i-1][t];
d[i][j]%=INF;
}
sum=0;
for(j=1;j<k;j++)
{
sum+=d[l][j];
sum%=INF;
}
cout<<sum<<endl;
return 0;
}原文地址:http://blog.csdn.net/u014492609/article/details/44244181