miku
這個題很顯然的可以從部分分推到正解
64上去就是乙個四維dp,dp[i][j][k][z]表示在第1行的時候第一行選了j個,第2行選了k個,第3行選了z個的
情況下的方案數,轉移用手就能推。
只是有個小細節
#include#include#include#include#define int long long
using namespace std;
int n,m;
int ma[101][2001];
int mod=998244353;
int dp[101][41][41][41];
int ans;
signed main()
} dp[0][0][0][0]=1;
//我是 小細節
for(int i=1;i<=n;++i)
}} }
for(int i=0;i<=n/2;++i)
}} }
cout《要考慮更多的列,那何不壓縮一下,改成三維,前兩維一樣,但是第三維改成其餘行選了幾個
這樣的話,就要分開考慮每一列了。然後再運用一點點數學知識
顯然考慮合法方案很噁心,可是scz說說過「正難則反」%%%
求出所有解減去不合法的。
#include#include#include#include#define int long long
using namespace std;
int n,m;
int ma[101][2001];
int mod=998244353;
int dp[101][51][80];
int sum[101];
int ans=1;
int simex;
signed main()
//sum[i]%=mod;
ans=(ans*(sum[i]+1)%mod)%mod;
} //dp[0][0][0]=1;
for(int q=1;q<=m;++q)
if(z)}}
} for(int ii=1;ii<=n;++ii)
}simex=(simex+mod)%mod;
} } cout<<(ans-simex-1+mod)%mod;
return 0;
}
要想拿到這個,還要再壓一維。我們關心選了幾個嗎?不,正相反,這個差才是關心的。
又少了一位,但是差可能是個負數,最小是-n,那麼就全部加上乙個n。
P5664 Emiya 家今天的飯
哭了qaq這題整了12345678天,在題解和sy的部落格幫助下完成了題目qaq 給出乙個n m的矩陣,總共選k個,不能不選,要求 1.每行只能選乙個 2.每列最多選 個求出合法方案數 抽象理解一下就是這麼個東西 直接求解莫得思路,然後正難則反,我們考慮總方案數 不合法方案數 考慮沒有任何限制,我們...
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行,第...