哭了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行,第...