竞赛讨论区 > B题的疑惑
头像
南判
编辑于 2021-01-03 09:19
+ 关注

B题的疑惑

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 16;
int n, y, a, b, dp[2][3];
// dp[i][0]表示对当前a不操作的最大值,dp[i][1]表示对当前a+b的最大值,dp[i][2]表示对当前a-b的最大值
// dp[0]表示前k个数的三种情况的最大值,dp[1]表示当前执行的第k + 1个数,因此只保留两行
inline void work(int i, int t)
{
    for (int j = 0; j < 3; ++j)
        dp[1][i] = max(dp[1][i], ((dp[0][j] + t) % y + y) % y);
}
int main()
{
    int sum = 0;
    scanf("%d%d", &n, &y);
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &a);
        sum = (sum + a) % y;
    }
    for (int i = 0; i < 3; ++i)
        dp[0][i] = sum;        // 结果至少为sum
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &b);
        for (int j = 0; j < 3; ++j)
            dp[1][j] = sum;
        // 对三种情况分别根据前k个的三种结果取最大值
        work(0, 0);
        work(1, b);
        work(2, -b);
        for (int j = 0; j < 3; ++j)
            dp[0][j] = dp[1][j];        // 将前k + 1个的结果覆盖前k个结果以优化空间
    }
    printf("%d\n", max(max(dp[0][0], dp[0][1]), dp[0][2]));
    return 0;
}

全部评论

(4) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐