[关闭]
@exut 2024-10-17T23:19:29.000000Z 字数 1107 阅读 144

test1018

考试总结


越来越菜了,该退役了

开题顺序极其不合理,高估了计算几何题做高分做法的可行性,实际上押dp更加可靠

这次时间分配也不合理,做不出还在死磕,罚坐了

T1

其实是个很弱的dp,但是有个沙比跳掉了

考虑设 表示前 构成 段,剩余几个偶数(当然奇数也可以),当前这一位是奇数还是偶数,然后式子比较长不放了看代码吧

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=303;
  5. const int mod=1e9+7;
  6. int n,m,a[N],cnt[N],dp[N][N][N][2],sum;
  7. signed main(){
  8. freopen("2475.in", "r", stdin);
  9. freopen("2475.out", "w", stdout);
  10. ios::sync_with_stdio(0);
  11. cin.tie(0),cout.tie(0);
  12. cin>>n>>m;
  13. for(int i=1;i<=n;i++){
  14. cin>>a[i];
  15. if(a[i]) cnt[a[i]&1]++;
  16. }
  17. cnt[0]=n/2-cnt[0];
  18. cnt[1]=ceil(1.0*n/2)-cnt[1];
  19. dp[0][0][0][0]=dp[0][0][0][1]=1;
  20. for(int i=1;i<=n;i++){
  21. if(!a[i]) sum++;
  22. for(int j=1;j<=m;j++){
  23. for(int k=0;k<=min(cnt[1],sum);k++){
  24. if(a[i]){
  25. if(a[i]&1) {
  26. dp[i][j][k][1]=(dp[i][j][k][1]+(dp[i-1][j-1][k][0]+dp[i-1][j][k][1])%mod)%mod;
  27. }else{
  28. dp[i][j][k][0]=(dp[i][j][k][0]+(dp[i-1][j][k][0]+dp[i-1][j-1][k][1])%mod)%mod;
  29. }
  30. }
  31. else{
  32. if(cnt[0]+k-sum+1>0) (dp[i][j][k][0]+=(((cnt[0]-(sum-k)+1)*(dp[i-1][j-1][k][1]+dp[i-1][j][k][0])%mod)%mod))%=mod;
  33. if(k!=0) (dp[i][j][k][1]+=((cnt[1]-k+1)*(dp[i-1][j-1][k-1][0]+dp[i-1][j][k-1][1])%mod)%mod)%=mod;
  34. }
  35. }
  36. }
  37. }
  38. cout<<(dp[n][m][cnt[1]][0]+dp[n][m][cnt[1]][1])%mod;
  39. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注