作为提高组 d 2 t 1 d2t1 d2t1,比去年难
所以这道题我打的特别的差
32pts
这道题我们很显然可以看到可以打一个暴力
复杂度 o ( n ∗ n ! ) o(n*n!) o(n∗n!)
我考场上就达到了这里——我太菜了
void dfs(int u,ll plus){
if(u==n+1){
if(!tot)return;
Rep(i,1,m)if(cnt[i]>tot/2)return;
ans=(ans+plus)%mod;
return;
}
dfs(u+1,plus);
Rep(i,1,m)
if(a[u][i]){
cnt[i]++;
tot++;
dfs(u+1,plus*a[u][i]%mod);
tot--;
cnt[i]--;
}
}
int main()
{
read(n),read(m);
Rep(i,1,n)Rep(j,1,m)read(a[i][j]);
dfs(1,1);
printf("%lld\n",ans);
return 0;
}
因为每一行只能选一个,所以我们可以每行爆搜找选哪个(或者不选),随后判断行不行
64 pts
这道题一拿到题就觉得是 d p dp dp,但是没想出来转移方程,想要拿到64分,我们需要把 m m m=2,3的情况拆成两种来讨论,当 m = 2 m=2 m=2时,用 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示第 i i i行,第一种食材用了 j j j次,第二种用了 k k k次,可以显然得到一个转移方程 f [ i ] [ j ] [ k ] = s u m { f [ i − 1 ] [ j ] [ k ] , f [ i − 1 ] [ j − 1 ] [ k ] ∗ a [ i ] [ 1 ] , f [ i − 1 ] [ j ] [ k − 1 ] ∗ a [ i ] [ 2 ] } f[i][j][k]=sum\{f[i-1][j][k],f[i-1][j-1][k]*a[i][1],f[i-1][j][k-1]*a[i][2]\} f[i][j][k]=sum{
f[i−1][j][k],f[i−1][j−1][k]∗a[i][1],f[i−1][j][k−1]∗a[i][2]}
当 m = 3 m=3 m=3时就是四位 d p dp dp
if(m==2){
f[0][0]

最低0.47元/天 解锁文章
442

被折叠的 条评论
为什么被折叠?



