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;
}
posted @ 2022-09-23 16:33  Vijurria  阅读(38)  评论(0编辑  收藏  举报