Cod sursa(job #3278477)

Utilizator Radu_Stefan2010Radu Loga Radu_Stefan2010 Data 19 februarie 2025 22:00:36
Problema Elimin Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("elimin.in");
ofstream out("elimin.out");

int n,m,l[7295],c[7295],st[7295],sc[7295],sl[7295],b[7295][7295],a[7295][7295],smax,x,r,cc,nr;

void verifl()
{
    if(nr==r)
    {
        int suma=0,s[7295];
        for(int j=1; j<=m; j++)
            s[j]=sc[j];
        sort(s+1,s+m+1);
        for(int i=cc+1;i<=m;i++)
            suma+=s[i];
        if(suma>smax)
            smax=suma;
    }
}
void backl(int k)
{
    if(k>n)
        verifl();
    else
    {
        for(int i=0; i<=1; i++)
        {
            st[k]=i;
            if(i==1)
            {
                nr++;
                for(int j=1; j<=m; j++)
                    sc[j]-=a[k][j];
            }
            backl(k+1);
            if(i==1)
            {
                for(int j=1; j<=m; j++)
                    sc[j]+=a[k][j];
                nr--;
            }
        }
    }
}
void verifc()
{
    if(nr==cc)
    {
        int suma=0,s[7295];
        for(int j=1; j<=n; j++)
            s[j]=sl[j];
        sort(s+1,s+n+1);
        for(int i=r+1;i<=n;i++)
            suma+=s[i];
        if(suma>smax)
            smax=suma;
    }
}
void backc(int k)
{
    if(k>m)
        verifc();
    else
    {
        for(int i=0; i<=1; i++)
        {
            st[k]=i;
            if(i==1)
            {
                nr++;
                for(int j=1; j<=n; j++)
                    sl[j]-=a[j][k];
            }
            backc(k+1);
            if(i==1)
            {
                for(int j=1; j<=n; j++)
                    sl[j]+=a[j][k];
                nr--;
            }
        }
    }
}
int main()
{
    in>>n>>m>>r>>cc;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            in>>a[i][j];
            l[i]+=a[i][j];
            sl[i]=l[i];
            c[j]+=a[i][j];
            sc[j]=c[j];
        }
    smax=0;
    if(n<m)
        backl(1);
    else
    {
        backc(1);
    }
    out<<smax;
    return 0;
}