時間限制
如果
如果一個序列可以分成正數個好的序列,則稱其為好序列。每個好的序列應該是序列的一個子段,並且序列的每個元素都應該完全屬於一個序列。例如,
對於給定的序列,計算其為好序列的子序列的數量,並模
3 題解我們設
那麼如何計算這一部分答案呢?我們發現:在後面找到的好序列一定是某個
在這裡解釋一下這個轉移:由於
至於組合數,我們可以在開頭利用
代碼(空格警告):
#include <iostream>
using namespace std;
const int N = 1e3+10;
const int mod = 998244353;
#define int long long
int n, ans;
int a[N], dp[N], c[N][N];
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) c[i][i] = 1, c[i][0] = 1;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j < i; j++)
{
c[i][j] = (c[i-1][j] % mod + c[i-1][j-1] % mod) % mod;
}
}
for (int i = n; i >= 1; i--)
{
if (a[i] <= 0) continue;
if (n - i >= a[i])
{
for (int j = i+2; j <= n; j++)
{
dp[i] = (dp[i] + (c[j-i-1][a[i]] * dp[j] % mod) % mod) % mod;
}
dp[i] = (dp[i] + c[n-i][a[i]]) % mod;
}
}
for (int i = 1; i <= n; i++) ans = (ans + dp[i]) % mod;
cout << ans;
return 0;
}
歡迎關注