ABC 242 C - 1111gal password(DP)
https://atcoder.jp/contests/abc242/tasks/abc242_c
题目大意:
给定一个数字的位数,让我们构建出这样的数字:
相邻两位的绝对值<=1,每一位数字都在[1,9]范围之内
求取模后的种类数。
输入
4
输出
203
输入
2
输出
25
输入
1000000
输出
248860093
- 思考方向:DP
f[i][j]表示已经存在i个位置,以j作为结尾的种类数
每一个数字j在选择了之后,后一位都可以有三种选择:j-1,j,j+1
所以就可以得出状态转移方程:
f[i][j]=(f[i-1][j-1]+f[i-1][j]+f[i-1][j+1])%mod;
- 详解如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1000020;
const LL N=500200,M=2002;
const LL mod=998244353;
LL f[MAXN][12];
//f[i][j]表示已经存在i个位置上,以j作为结尾的种类数
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n;
cin>>n;
//当前位数只存在1位的时候,无论想用什么结尾,都只有一种结局,那就是他自己
for(LL i=1;i<=9;i++)
f[1][i]=1;
for(LL i=2;i<=n;i++)
{
for(int j=1;j<=9;j++)
{
f[i][j]=(f[i-1][j-1]+f[i-1][j]+f[i-1][j+1])%mod;
}
}
LL ans=0;
for(LL i=1;i<=9;i++)
ans=(ans+f[n][i])%mod;
cout<<ans<<endl;
}
return 0;
}