LOADING

加载过慢请开启缓存,浏览器默认开启

daily 1

2023/4/5 daily

最后一天摆烂了,明天绝对要开始继续做人

CF 375B

dp[j][i]表示第j列的第i行的最长连续1是多少
由于我们可以重排行,那么我们就对列做操作

从1遍历到m,然后每次取dp[j][i],记得等于0的时候break

void solve(){
  int n,m;
  cin>>n>>m;
  vector<string>mp(n+1);
  for(int i=1;i<=n;++i){
    cin>>mp[i];
    mp[i]='0'+mp[i];
  }
  vector<vector<int>>dp(m+1,vector<int>(n+1));
  for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
        if(mp[i][j]=='1'){
            dp[j][i]=dp[j-1][i]+1;
        }
    }
  }
  int ans=0;
  for(int j=1;j<=m;++j){
    sort(dp[j].begin()+1,dp[j].end(),greater<int>());
    for(int i=1;i<=n;++i){
        if(dp[j][i]==0)break;
        ans=max(dp[j][i]*i,ans);
    }
  }
  cout<<ans<<'\n';
  return;
}