题意如上所示。
我们建立 dp[ i ] [ j ] 数组,i 表示位数,j 表示当前位放置的数字。
我们以 S = 2 为例,若第二位为 3,则可以得出 dp[ 2 ] [ 3 ] = dp[ 1 ] [ 2 ] + dp[ 1 ] [ 3 ] + dp[ 1 ] [ 4 ] ,因此我们以这个结论去依次遍历每一位即可。但是要注意对于 1 而言,他只能从上一位的 1 和 2继承,因为 ki 不能等于 0;而对于 9 而言,他只能从上一位的 8 和 9继承,因为 ki 不能为 10。
接着,我们初始化 dp[ 1 ] [ i ] = 1,然后依次遍历每一位即可,特别注意 1 和 9 的情况。
代码如下
#include<bits/stdc++.h>
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 998244353;
using namespace std;
ll dp[202020][20];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 1; i <= 9; i++) {
dp[1][i] = 1; //初始化数组
}
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= 9; j++) {
if (j == 1) {
dp[i][j] = dp[i - 1][1] + dp[i - 1][2];
}
else if (j == 9) {
dp[i][j] = dp[i - 1][8] + dp[i - 1][9];
}
else {
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] + dp[i - 1][j + 1];
}
dp[i][j] %= mod; //取模
}
}
ll sum = 0;
for (int i = 1; i <= 9; i++) {
sum += dp[n][i];
sum %= mod;
}
cout << sum << endl;
}
return 0;
}