牛客OI周赛15-普及组(C区间加 dp)

题目链接

官方题解:

学到了。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const ll mod=998244355;
const int N=2e3+10;
ll dp[N][N];
int n,m,a[N];
void add(ll &x,ll y)
{
    x=(x+y)%mod;
}
int main()
{
    cin>>n>>m;
    rep(i,1,n) scanf("%d",&a[i]);
    if(a[1]==m-1||a[1]==m) dp[1][0]=1;
    if(a[1]==m-1) dp[1][1]=1;

    for(int i=2;i<=n;++i){
        for(int j=0;j<=m;++j){
            if(a[i]+j==m){
                add(dp[i][j],dp[i-1][j]);
                if(j) add(dp[i][j],dp[i-1][j-1]);
            }
            if(a[i]+j+1==m){
                add(dp[i][j],dp[i-1][j+1]*(j+1)%mod);
                add(dp[i][j],dp[i-1][j]*(j+1)%mod);
            }
        }
    }
    printf("%lld\n",dp[n][0]);

}
发布了519 篇原创文章 · 获赞 69 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/105313144