2 条题解

  • 0
    @ 2025-10-9 16:54:34

    P5664 [CSP-S2019] 伊原家今天的飯

    這道題非常優雅!

    首先我們發現考慮這個 jk2j \le \left \lfloor \frac{k}{2} \right \rfloor 這個條件直接算比較困難,所以我們考慮正反則難

    因為僅可能有一個 colcol 滿足 colk2col \ge \left \lfloor \frac{k}{2} \right \rfloor 所以我們考慮枚舉這一個 colcol

    那我們算這個東西顯然直接組合數是算不了的了,我們使用dp,設 dpi,j,kdp_{i,j,k} 表示前 ii 行在第 colcol 列選了 kk 個,然後在其餘列選了 jj 個的方案數

    那我們轉移的時候有三種情況:

    1. 不選第 ii
    2. 選擇第 ii 行第 colcol 列的數字
    3. 選取第 ii 行不在第 colcol 列的數字

    則有dp轉移:

    dpi,j,k=dpi1,j,kdp_{i,j,k}=dp_{i-1,j,k} $$dp_{i,j,k}=dp_{i-1,j-1,k} \times (sum_i-a_{i,col}) $$dpi,j,k=dpi1,j,k1×ai,coldp_{i,j,k}=dp_{i-1,j,k-1} \times a_{i,col}

    初始值:dp0,0,0=1dp_{0,0,0}=1

    答案:ansdpn,j,k(j<k)ans-dp_{n,j,k} (j<k)

    這樣時間複雜度是 O(m×n3)O(m \times n^3) 的,過不了 那我們就考慮,類似存兩個變量,我們發現對於這兩個變量的具體值是沒有必要記錄的,僅僅需要記錄滿足 k>jk>j 的情況,因為僅僅有這樣,才可以不滿足題目條件

    那我們完全可以只記錄這個東西的差值,把dp狀態改成:dpi,jdp_{i,j} 表示前 ii 行選完之後,第 colcol 行列選的比其他列選的多 jj 個(當然 jj 可能是負數,所以我們需要加上一個偏移量 nn

    還是剛剛那幾種情況,則有轉移:

    dpi,j=dpi1,jdp_{i,j}=dp_{i-1,j} dpi,j=dpi1,j1×ai,coldp_{i,j}=dp_{i-1,j-1} \times a_{i,col} dpi,j=dpi1,j+1×(sumiai,col)dp_{i,j}=dp_{i-1,j+1} \times (sum_i-a_{i,col})

    初值:dp0,0=1dp_{0,0}=1

    答案:ansdpnjj>0ans-dp_{n,j}(j>0)

    那我們總的答案如何算呢? 還是可以使用dp,也可以不用

    我設gi0/1g_{i,0/1}表示前ii行,並且第ii行選/不選的方案數

    顯然有轉移:

    gi,0=gi1,0+gi1,1g_{i,0}=g_{i-1,0}+g_{i-1,1} gi,1=(gi1,0+gi1,1)×sumig_{i,1}=(g_{i-1,0}+g_{i-1,1}) \times sum_i

    初值:g0,0=1g_{0,0}=1

    答案:ans=gn0+gn,11ans=g_{n,0}+g_ {n,1}-1

    • 0
      @ 2025-10-9 16:51:55

      P5664 [CSP-S2019] Emiya 家今天的饭

      这道题非常优雅!

      首先我们发现考虑这个 jk2j \le \left \lfloor \frac{k}{2} \right \rfloor 这个条件直接算比较困难,所以我们考虑正反则难

      因为仅仅可能有一个 colcol 满足 colk2col \ge \left \lfloor \frac{k}{2} \right \rfloor 所以我们考虑枚举这一个 colcol

      那我们算这个东西显然直接组合数是算不了的了,我们使用dp,设 dpi,j,kdp_{i,j,k} 表示前 ii 行在第 colcol 列选了 kk 个,然后在其余列选了 jj 个的方案数

      那我们转移的时候有三种情况:

      1. 不选第 ii
      2. 选第 ii 行第 colcol 列的数字
      3. 选第 ii 行不在第 colcol 列的数字

      则有dp转移:

      dpi,j,k=dpi1,j,kdp_{i,j,k}=dp_{i-1,j,k} $$dp_{i,j,k}=dp_{i-1,j-1,k} \times (sum_i-a_{i,col}) $$dpi,j,k=dpi1,j,k1×ai,coldp_{i,j,k}=dp_{i-1,j,k-1} \times a_{i,col}

      初值:dp0,0,0=1dp_{0,0,0}=1

      答案:ansdpn,j,k(j<k)ans-dp_{n,j,k} (j<k)

      这样时间复杂度是 O(m×n3)O(m \times n^3) 的,过不了

      那我们就考虑,类似存两个变量,我们发现对于这两个变量的具体值是没有必要记录的,仅仅需要记录满足 k>jk>j 的情况,因为仅仅有这样,才可以不满足题目条件

      那我们完全可以仅仅记录这个东西的差值,把dp状态改为:dpi,jdp_{i,j} 表示前 ii 行选完之后,第 colcol 行列选的比其他列选的多 jj 个(当然 jj 可能是负数,所以我们需要加上一个偏移量 nn

      还是刚刚那几种情况,则有转移:

      dpi,j=dpi1,jdp_{i,j}=dp_{i-1,j} dpi,j=dpi1,j1×ai,coldp_{i,j}=dp_{i-1,j-1} \times a_{i,col} dpi,j=dpi1,j+1×(sumiai,col)dp_{i,j}=dp_{i-1,j+1} \times (sum_i-a_{i,col})

      初值:dp0,0=1dp_{0,0}=1

      答案:ansdpn,j(j>0)ans-dp_{n,j}(j>0)

      那我们总的答案如何算呢?还是可以使用dp,也可以不用

      我设 gi,0/1g_{i,0/1} 表示前 ii 行,并且第 ii 行选/不选的方案数

      显然有转移:

      gi,0=gi1,0+gi1,1g_{i,0}=g_{i-1,0}+g_{i-1,1} gi,1=(gi1,0+gi1,1)×sumig_{i,1}=(g_{i-1,0}+g_{i-1,1}) \times sum_i

      初值:g0,0=1g_{0,0}=1

      答案:ans=gn,0+gn,11ans=g_{n,0}+g_{n,1}-1

      • 1

      信息

      ID
      459
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      (无)
      递交数
      5
      已通过
      3
      上传者