Sam 数
【问题描述】
小 G 最近发现了一种非常有趣的数,他将这种数称之为 Sam 数。Sam 数具有以下特征:相邻两位的数字之差不超过 2。小 G 还将 Sam 数按位数进行了分类,他将一个 k 位 Sam 数称之为 k 阶 Sam 数。但不幸的是小 G 发现他数不清第k 阶的 Sam 数一共有多少个,这个时候机智的他想到了向你求助。
【输入格式】
第一行为一个整数 k,含义见题面。
【输出格式】
一行一个整数 ans,表示 k 阶的 Sam 数的个数。
由于第 k 阶 Sam 数非常多,你只需要输出 ans mod 1,000,000,007。
【样例输入】
4
【样例输出】
867
【数据规模和约定】
对于 30%的数据,1 ≤ k ≤ 6。
对于 60%的数据,1 ≤ k ≤ 1000。
对于 100%的数据,1 ≤ k ≤ 1000000。
思路:DP
设f[i][j]为前i个数以j结尾的方案总数
则我们可以得出转移方程:
f[i][j]=f[i-1][j-2]+…+f[i-1][j+2];
三个注意点:
1:j-2可能<0,导致数组越界
2:f[1][0]=0,否则会将如:“00010”一类的数算入
3:在“2”的情况下,如果输入为“1”,则输出为“9”,本应输出“10”,加特判即可
答案在f[n][0~9]中
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>