每日刷题(五十六)
ALGO-3、K好数
这个题考的是动态规划。你需要找到每一层的表达式关系。
我们可以从个位开始找,如果右边那个数j与循环的数v相差不为1,则加上之前循环过得到的以j为末尾的统计数目,一层层叠加就可以得到第L位所有的数目种类。别忘了还要取模1000000007
详细C代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int K, L;
scanf("%d %d", &K, &L);
long long a[L][K];
memset(a, 0, sizeof(a));
int i, j;
if(L == 1)
{
printf("0\n"); //如果只是一位数,那么就不存在相邻的数字
return 0;
}
for(j = 0; j < K; j++) //初始化
{
a[0][j] = 1;
}
int v;
for(i = 1; i < L; i++)
{
for(j = 0; j < K; j++)
{
for(v = 0; v < K; v++)
{
if(abs(v - j) != 1)
{
a[i][j] += a[i - 1][v]; //递推公式,如果满足条件则加上相邻为v的情况
a[i][j] %= 1000000007;
}
}
}
}
long long sum = 0;
for(j = 1; j < K; j++) //以0为“末尾”的数不考虑
{
sum += a[L - 1][j];
sum %= 1000000007;
}
printf("%lld\n", sum);
return 0;
}
样例运行结果如下