题解:AT_abc222_d [ABC222D] Between Two Arrays
思路
这道题一眼的dp
dp首先要设状态,一个很容易想到的状态就是表示前个数有多少种答案。但是我们会发现:很难从前面的答案转移过来,因为不知道上一次选的数是否大于。于是我们考虑加状态,得到表示前个数最后一个数的答案数。
这次,我们就可以很容易的推出状态转移方程:,因为包含了所有,但还比多了。为了防止,要将和取一个最小值。
最后,初始化是,答案是,感觉不用说了。
代码
上面解释的很清楚了懒得写注释了
#include <iostream>
using namespace std;
const int mod=998244353;
int n;
int a[3010],b[3010];
int dp[3010][3010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=a[i];j<=b[i];j++)
{
dp[i][j]=j>=1?dp[i][j-1]:0;
dp[i][j]=(dp[i][j]+dp[i-1][min(j,b[i-1])])%mod;
}
}
cout<<dp[n][b[n]];
return 0;
}

浙公网安备 33010602011771号