AC了但没完全理解一行代码
  • 板块P4933 大师
  • 楼主Subingbupt
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/28 18:01
  • 上次更新2024/11/28 20:16:24
查看原帖
AC了但没完全理解一行代码
1196787
Subingbupt楼主2024/11/28 18:01
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxh 20000
constexpr int mod = 998244353;
vector<int> id[maxh + 1];
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, ans = 0;
    cin >> n;
    vector<int> h(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> h[i], id[h[i]].push_back(i);
    // 枚举公差
    for (int d = -maxh; d <= maxh; d++)
    {
        // dp[i]表示以h[i]结尾有多少个公差为d的等差数列
        vector<int> dp(n + 1, 1);
        for (int i = 2; i <= n; i++)
        {
            int pre = h[i] - d;
            if (pre < 0 || pre > maxh)
                continue;
            for (int j = 0; j < (int)id[pre].size() && id[pre][j] < i; j++)
                dp[i] = (dp[i] + dp[id[pre][j]]) % mod;
        }
        for (int i = 1; i <= n; i++)
            ans = (ans + dp[i]) % mod;
    }
    // 这行代码的意义是什么
    ans = (ans + mod - 2 * maxh * n) % mod;
    cout << ans << '\n';
    return 0;
}

为什么有了这行就对了 ans = (ans + mod - 2 * maxh * n) % mod;

2024/11/28 18:01
加载中...