sam数

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值