Luogu P5664 Emiya 家今天的飯

2022-04-02 21:23:23 字數 1038 閱讀 7067

重做下去年的csp題找找感覺,去年d1t2寫可持久化線段樹上二分的悲慘經歷讓我對d1t2充滿了厭惡(好吧其實是正解在簡單都懶得寫了),因此就來改這個去年沒調出來的dp了

首先這個主要食材佔一半一眼容斥,因此我們大體思路就有了

先求出不管這個限制的總方案數,設\(f_\)表示前\(i\)種方法中做了\(j\)道菜的方案數,記錄乙個每行的和顯然可以\(o(n^2)\)轉移

考慮大力列舉哪個食材\(p\)超過了\(\lfloor \frac\rfloor\),顯然可以再做一次dp,設\(g_\)表示前\(i\)種方法中做了\(j\)道菜的方案數,其中有\(k\)道菜使用了食材\(p\),轉移顯然

但這樣總複雜度是\(o(n^3m)\)無法通過,放一下**意思一下

#include#include#define ri register int

#define ci const int&

using namespace std;

const int n=105,m=2005,mod=998244353;

int n,m,a[n][m],f[n][n],g[n][n][n],sum[n],ans;

int main()

return printf("%d",ans),0;

}

我們仔細觀察一下轉移方程發現我們只需要知道後兩維的差即可(話說這一年做的agc中有太多這樣的套路了),因此直接壓成一維總複雜度就是\(o(n^2m)\)的了

#include#include#define ri register int

#define ci const int&

using namespace std;

const int n=105,m=2005,mod=998244353;

int n,m,a[n][m],f[n][n],g[n][n<<1],sum[n],ans;

int main()

return printf("%d",ans),0;

}

題解 LuoGu5664 Emiya 家今天的飯

原題傳送門 每行最多取乙個告訴我們可以枚舉行 所以這道題目總體複雜度裡肯定有行的複雜度o n o n o n 考場上寫的是m 2 3 m 2 3 m 2 3的暴力,直接把每一列分別取了幾個寫到狀態裡面去 正解需要考慮正難則反 我們寫直接將每行最多乙個當作大前提 要求的是沒有一列取了超過一半的東西 那...

P5664 Emiya 家今天的飯

miku 這個題很顯然的可以從部分分推到正解 64上去就是乙個四維dp,dp i j k z 表示在第1行的時候第一行選了j個,第2行選了k個,第3行選了z個的 情況下的方案數,轉移用手就能推。只是有個小細節 include include include include define int lo...

P5664 Emiya 家今天的飯

哭了qaq這題整了12345678天,在題解和sy的部落格幫助下完成了題目qaq 給出乙個n m的矩陣,總共選k個,不能不選,要求 1.每行只能選乙個 2.每列最多選 個求出合法方案數 抽象理解一下就是這麼個東西 直接求解莫得思路,然後正難則反,我們考慮總方案數 不合法方案數 考慮沒有任何限制,我們...