最后一天摆烂了,明天绝对要开始继续做人
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;
}