官方题解
2026-04-11 11:38:59
发布于:浙江
17阅读
0回复
0点赞
题目大意
给定两个非递减数组 满足 ,求非递减数组 满足 的个数,并对 取模。
解题思路
考虑 。
状态表示:令 表示在数组 的前 个中且 的数量。
状态计算:显然, 一定包含 和 。所以转移方程如下(注意: 需要满足 ):
在递推之前先处理一下 的状态,即递推起点。
最终结果为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 3010;
const int mod = 998244353;
int a[N],b[N];
ll dp[N][N]; // 前 i 个数, 第 i 个数选小于 j 的方案数
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=a[1];i<=b[1];i++) dp[1][i]=i-a[1]+1;
for(int i=2;i<=n;i++){
for(int j=a[i];j<=b[i];j++){
dp[i][j]=(dp[i][j]+dp[i-1][min(b[i-1],j)])%mod;
if(j>0) dp[i][j]=(dp[i][j]+dp[i][j-1])%mod;
}
}
cout<<dp[n][b[n]]<<endl;
return 0;
}
全部评论 1

老师这里可以改一下,这个转移方程好像不对劲3天前 来自 浙江
0已修改
3天前 来自 浙江
0
3天前 来自 浙江
0











有帮助,赞一个