首页 > 其他分享 >NOIP 前 dp 做题小记

NOIP 前 dp 做题小记

时间:2024-10-05 16:33:59浏览次数:9  
标签:tmp le NOIP int 城堡 复杂度 dp 小记

NOIP 前 dp 做题小记

  1. [BJOI2019] 排兵布阵

    设 \(f(i, j)\) 表示在前 \(i\) 个城堡中总共派遣 \(j\) 个士兵时,可以获得的最大分数。

    初始化:\(\forall 0 \le j \le m\),\(f(0, j) = 0\)

    答案统计:\(ans = f(n, m)\)

    转移:\(f(i, j) = \max_{0 \le k \le j} f(i - 1, j - k) + g(i, k)\)。其中 \(g(i, k)\) 表示向第 \(i\) 个城堡派遣 \(k\) 个士兵能获得的分数。这里就是在枚举在第 \(i\) 个城堡中投入的兵力 \(k\) 来转移。

    \(g(x, y)\)(\(0 \le x \le n\),\(0 \le y \le m\))可以在 \(O(n(s \log s + m))\) 的时间内预处理:

    for(int i = 1; i <= n; i++)
    {
        deque<int> tmp;
        for(int j = 1; j <= s; j++)
            tmp.push_back(a[j][i]);
        sort(tmp.begin(), tmp.end());
        int cnt = 0;
        for(int j = 0; j <= m; j++)
        {
            while(!tmp.empty() && j > tmp.front() * 2)
            {
                cnt++;
                tmp.pop_front();
            }
            g[i][j] = cnt * i;
        }
    }
    

    时间复杂度分析:预处理 \(g\) 花费 \(O(n(s \log s + m))\),dp 状态数 \(O(nm)\),单次转移的时间复杂度为 \(O(m)\),总时间复杂度为 \(O(nm^2)\)(忽略了预处理的时间复杂度,因为不是瓶颈)。可以获得 40 分


    优化:

    决策的角度来考虑。向第 \(i\) 个城堡投入兵力时,并不是每多派遣一个士兵,在此城堡中获得的分数都会增加。设 \(g(i, j)\) 表示向第 \(i\) 投入兵力第 \(j\) 多的人派遣的士兵的数量(与上文的 \(g\) 的含义不同),则我方投入的兵力只有在恰好达到某个 \(2g(i, j) + 1\) 时,在此城堡上得到的分数才会增加。这启发我们转移时不是枚举向城堡中投入的人数,而是枚举要超过多少人的兵力的两倍。这样转移的时间复杂度就从 \(O(m)\) 降到了 \(O(s)\),总时间复杂度降到 \(O(nms)\),可以通过。

    另一种思考方法是把问题转化为分组背包问题。按城堡来分组,每个组有 \((s + 1)\) 个物品,第 \(i\) 组第 \(j\) 个物品代表我方在第 \(i\) 个城堡中打败了 \(j\) 个人,据此可以得出其花费为 \(2g(i, j) + 1\),价值为 \(ij\)。

  2. P4310 绝世好题

    注意“子序列”不一定是连续的。

    • \(O(n^2)\) 做法

      设 \(f(i)\) 表示以第 \(i\) 个元素结尾的最长合法子序列的长度,显然 \(f(i) = \max_{1 \le j < i \and a_i \operatorname{and} a_j \neq 0} \{f(j) + 1\}\)

    • \(O(n)\) 做法

      从位运算的角度出发。

      设 \(f(i)\) 表示结尾元素的第 \(i\) 个二进制位为 \(1\) 时,最长的合法子序列的长度。

      计算 \(f(i)\) 时,枚举 \(a_i\) 的第 \(j\) 位二进制位为 \(1\) 的 \(j\),用 \(f(j) + 1\) 来更新 \(tmp\),然后再反过来用 \(tmp\) 来更新 \(f(j)\)。

      for(int i = 0; i < n; i++)
      {
          int tmp = 0;
          for(int j = 0; (1 << j) <= a[i]; j++)
              if(a[i] & (1 << j)) tmp = max(tmp, f[j] + 1);
          for(int j = 0; (1 << j) <= a[i]; j++)
              if(a[i] & (1 << j)) f[j] = tmp;
          ans = max(ans, tmp);
      }
      
  3. [JSOI2016] 最佳团体

    题意:给定一棵树,每个节点 \(i\) 有费用和权值。选择一个包含根节点且有 \((K + 1)\) 个点的连通块,使得节点总权值与总费用的比最大。

    分数规划

  4. P1453 城市环路

    题意:求基环树的最大带权独立集

    树上最大带权独立集是树形 dp 经典题目:没有上司的舞会。回忆一下做法:设 \(f(u, 1/0)\) 分别表示选/不选 \(u\) 时,在 \(T(u)\) 中能获得的最大权值。转移方程如下:

    \[f(u, 1) = \sum_{v \in son(u)} f(v, 0) \\ f(u, 0) = \sum_{v \in son(u)} \max(f(v, 1), f(v, 0)) \]

    而在这道题中,图多了一条边,形成了一棵基环树。如何转化到树上问题呢?

    由于基环树有且只有一个环,因此删去环上的任意一条边后,基环树就变成了真正的树。不妨假设删去的边是 \((x, y)\),我们在删完边后的图上做树形 dp 求树上最大带权独立集。但考虑到删去的边的限制,\(x\) 和 \(y\) 这两个节点不能同时选择,这需要在 dp 中有所体现。

    修改是不难的:只需分别以 \(x\) 和 \(y\) 为根各做一次树形 dp,则答案为 \(\max(f(x, 0), f(y, 0))\)。这相当于分别钦定了不选择 \(x\) 或不选择 \(y\),这样得到的答案一定合法,并且是考虑周全的。

    提交记录

标签:tmp,le,NOIP,int,城堡,复杂度,dp,小记
From: https://www.cnblogs.com/dengstar/p/18447967

相关文章

  • [赛记] 多校A层冲刺NOIP2024模拟赛01【衡中】
    构造字符串50pts错解50pts;考虑正解,对于题目中的要求,我们可以转换成若干个相等与不等的操作,若相等则用并查集合并一下,不等则连边,若同块连边则无解,否则从前往后遍历赋值,每次找所连边其它块值的$\operatorname{mex}$即可;时间复杂度:$\Theta(nm\alpha(n))$;点击查看代码#i......
  • 南沙C++信奥赛陈老师解一本通题: 1828:【02NOIP提高组】均分纸牌
    ​ 【题目描述】有n堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为nn的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为n−1的堆上;其他堆上取的纸牌,可以移到相......
  • 斜率优化 DP
    斜率优化DP在单调队列优化过程中,转移方程被拆成了两部分,第一部分仅与\(j\)有关,而另一部分仅与\(i\)有关,因此我们可以利用单调队列仅维护与\(j\)有关的部分,实现问题的快速求解。但仍然有很多转移方程,\(i\)和\(j\)是紧密相关的,这个时候单调队列优化就不适用了,例如如下转......
  • DP 套 DP(DP of DP)
    把DP过程当作状态进行DP。DPofDP一般数据范围不会太大,而且一般是计数题。DPofDP的本质是自动机上DP。大致上可以写作\(dp[\dots][S]\)表示外层DP进行到\(\dots\)阶段,内层DP对应到\(S\)阶段。例一:基因题意:给出串\(s\)和一个数\(m\)。\(n=|s|\)。求对于......
  • [Ynoi2012] NOIP2015 充满了希望
    [Ynoi2012]NOIP2015充满了希望题意给一个长为\(n\)的序列,有\(m\)个操作,操作编号从\(1\)到\(m\),每个操作为:1xy:将序列位置为\(x,y\)的两个元素交换。2lrx:将序列区间\([l,r]\)内所有元素修改为\(x\)。3x:查询序列\(x\)位置的值。现在有\(q\)次查询,每次......
  • NOIP2024集训Day43 博弈论
    NOIP2024集训Day43博弈论F.多边形之战如果这个三角形三个顶点相邻,则先手必胜(第一刀就可以切)否则当黑色三角形只有一边与白色三角形相邻时才可以被切,显然那个白色三角形是最后一个白色三角形于是转化为:有\(n\)个石子,一次只能取一个,问取最后一个的人是谁做完了。G.[BZO......
  • 10.4 模拟赛(2025 炼石计划 NOIP 模拟赛 #7)
    2025--炼石计划--9月25日--NOIP模拟赛#7【订正】-比赛-梦熊联盟(mna.wang)复盘赢麻了。浏览题。T1没理解“中间节点”是啥意思,样例太大先不模拟了。T2什么东西,密铺?T3好像看懂了题。脑子中瞬间有一个\(n^3\)DP,发现\(n\le200\)感觉切了。但其实DP假的很......
  • 【题解】Solution Set - NOIP2024集训Day42 博弈论
    【题解】SolutionSet-NOIP2024集训Day42博弈论https://www.becoder.com.cn/contest/5574https://www.cnblogs.com/CloudWings/p/17813917.html「中山市选2009」谁能赢呢?一道经典的「二分图博弈」在棋盘问题上的应用。https://www.luogu.com.cn/article/h8a79k3i......
  • 【贪心】【二分】[NOIP2015]跳石头
    https://ac.nowcoder.com/acm/contest/22353/C正确的思路是二分查找+贪心。具体来说,可以通过二分来猜测一个最小的跳跃距离,然后通过贪心算法判断是否可以通过移除石头使所有的跳跃都满足这个最小跳跃距离。这种方法的核心是逐步逼近最优解,而不是直接删除前m小的元素。细节:在......
  • 10.2与10.3日noip多校联考总结
    10.2与10.3noip多校联考总结10.2T1考场上推了比较久,想到了对于每个二进制位进行贪心,但是往上面套了二分和判定,导致时间复杂度到了\(O(T\log^3n)\),时间过劣。在考后知道了二分和判定都可以省去。因为要求最小次数,所以不免想到了二分和贪心,用学长讲的“调整法”就可以很好......