https://ac.nowcoder.com/acm/contest/57358/J
二维dp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
ll dp[5005][10005]={0};
int main(){
ll n,m;
cin>>n>>m;
for(ll i=-m;i<=m;i++){
dp[1][i+m]=1;
}
for(ll i=2;i<=n;i++){
ll sum[10005];
sum[0]=dp[i-1][0];
//cout<<"sum ";
for(ll j=-m+1;j<=m;j++){
sum[j+m]=(sum[j-1+m]+dp[i-1][j+m])%mod;
//cout<<" "<<sum[j+m];
}
//cout<<endl;
for(ll j=-m;j<=m;j++){
if(j<0){
dp[i][j+m]=(sum[m+m]-sum[m-j-1]+mod)%mod;
}
else if(j>0){
dp[i][j+m]=(sum[m+m]-sum[j+m-m-1]+mod)%mod;
}
else{
dp[i][j+m]=sum[m+m];
}
}
}
ll ans=0;
for(int i=-m;i<=m;i++){
ans=(ans+dp[n][i+m])%mod;
}
cout<<ans;
}
i为当前取数个数,j为最小后缀和,维护种类数