P5664 Emiya 家今天的飯

2022-04-12 02:23:31 字數 2635 閱讀 1263

哭了qaq這題整了12345678天,在題解和sy的部落格幫助下完成了題目qaq

>給出乙個n*m的矩陣,總共選k個,不能不選,要求:

1.每行只能選乙個

2.每列最多選

個求出合法方案數

抽象理解一下就是這麼個東西

直接求解莫得思路,然後正難則反,我們考慮總方案數 - 不合法方案數

考慮沒有任何限制,我們可以隨便取,但是這中間的方案有一些是不滿足1的,也有些不滿足2的,還有的既不滿足1也不滿足2

我們不妨先滿足乙個要求1,也就是我們每行只選乙個,然後我們去掉在滿足要求1的前提下不滿足2的方案數

也就是:

總方案數 - 不合法方案數 = 滿足1的總方案數 - 滿足1但是不滿足2的方案數(不合法方案數)

1.怎麼求滿足1的方案數???

設定陣列tot[ i ][ j ]表示前 i 行最多選 j 個的方案數

sum[ i ]表示第 i 行數字總量

考慮對於當前第 i 行的每個數字都可以選或者不選,每次選乙個,就會與之前選過的構成新的方案(其實就是乘法分布原理),得到遞推式:

tot[ i ][ j ] = tot[ i-1 ][ j ] + tot[ i-1 ][ j-1 ] * sum[ i ]

2.怎麼求不合法方案數???

不合法也就是不滿足要求2,每列多於

個實際只有一列多於

個,因為如果有》=2列多於

個的話,選擇的總數就》k了,也就是出現了矛盾

所以可以考慮列舉不合法的列

我們設當前列舉的不合法列選擇了j個,其餘列一共選了k

wron[ i ][ j ][ k ] 表示當前列舉到了第i行,不合法列選擇j個,其餘列一共選擇了k個的方案數,每次列舉到乙個新的列,要麼該列乙個也不選,要麼選擇不合法列的這乙個,要麼選擇其餘列的乙個,得到遞推式:

wron[ i ][ j ][ k ] = wron[ i-1 ][ j ][ k ]

+ wron[ i-1 ][ j+1 ][ k ] * a[ i ][ line ]

+ wron[ i-1 ][ j ][ k+1 ] * ( sum[ i ] - a[ i ][ line ] )

實際我們並不關心j,k的具體數值,我們只需要知道他們的相對大小就好了,我們設不合法列比其餘列多選了 j 個,不合法列選擇了 x+j 個,那麼其餘列就選了 x 個,我們只需要列舉 j 就好了,遞推式改為:

wron[ i ][ j ] = wron[ i-1 ][ j ]

+ wron[ i-1 ][ j-1 ] * a[ i ][ line ]

+ wron[ i-1 ][ j+1 ] * ( sum[ i ] - a[ i ][ line ] )

注意不合法列最多會比別的列多選 i 個,最多會比別的列少選 i 個,也就是 j 的範圍其實是[ -i , i ],由於陣列下標不為負數,我們考慮下標統一加 n ,j 的列舉範圍也就是[ n-i , n+i ]

然後不合法的方案數就是 j > 0 的情況,總方案數減去就好了

最後注意取模就好了

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;inline ll read()

const

int mod=998244353

;int

n,m;

ll a[

105][2005

];ll sum[

105];

ll tot[

105][2005

];ll wron[

105][400

];ll ans=0

;int

main()

tot[

0][0]=1

;

for(int i=1;i<=n;i++)

for(int j=0;j<=n;j++)

tot[i][j]=((tot[i-1][j]%mod+tot[i-1][j-1]*sum[i]%mod)%mod+mod)%mod;

for(int i=1;i<=n;i++)

ans=(ans+tot[n][i])%mod;

for(int l=1;l<=m;l++)

printf(

"%lld\n

",ans);

return0;

}

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家今天的飯 dp

對於n nn個方法,m mm個材料,乙個方法配對乙個材料可以做an,ma an,m 道菜。選擇k kk個配對要求 配對至少為k 1k 1 k 1每個配對的方法不同 每個材料最多用 k2 lfloor frac rfloor 2k 次 求做菜方案數 考慮容斥減去多餘方案,也就是要求乙個材料用超過一半。...

洛谷 P5664 Emiya 家今天的飯(DP)

觀察題目資料範圍,發現前64pts可以用類似狀壓的思想來做 m 3 前84pts可以在o n 3 m 的時間內完成。100pts需要在o n 2 m 的時間內做。總述 注意總的初始化,初始化要為1,因為後面有乘的操作,最後的時候再將那個多餘的1減去。64pts 設f i j k q 表示到第i行,第...