Cod sursa(job #1264484)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 15 noiembrie 2014 21:10:19
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>

#define inf 1000005
using namespace std;

int n,m;
bool mat[155][18];
int din[155][18][32805];

inline int set(int k,int bit,bool val){
    return ((k&(~(1<<bit)))|(val<<bit));
}

int main()
{
    int k=0;
    cin>>n>>m>>k;

    int a,b;
    while(k--){
        cin>>a>>b;
        mat[a][b]=1;
    }

    int i,j;

    for(i=0;i<=n;i++)
        for(j=1;j<=m;j++)
            for(k=0;k<(1<<m);k++)
                din[i][j][k]=-inf;

    din[0][m][(1<<m)-1]=0;

    int nlin;
    int ncol;

    for(i=0;i<=n;i++)
        for(j=1;j<=m;j++)
            for(k=0;k<(1<<m);k++)
                if(din[i][j][k]!=-inf){
                    nlin=(i+(j==m));
                    ncol=((j==m)?1:(j+1));

                    din[nlin][ncol][set(k,ncol-1,mat[i][j])]=max(din[nlin][ncol][set(k,ncol-1,mat[i][j])],din[i][j][k]);

                    if(j!=(m-1)){
                        nlin=(i+(j==m));
                        ncol=((j==m)?2:(j+2));

                        if(!mat[nlin][ncol] && !mat[nlin][ncol-1] && !(k&(1<<(ncol-1))) && !(k&(1<<(ncol-2))))
                            din[nlin][ncol][set(set(k,ncol-1,1),ncol-2,1)]=max(din[nlin][ncol][set(set(k,ncol-1,1),ncol-2,1)],din[i][j][k]+1);
                    }
                }

    int ans=0;
    for(k=0;k<(1<<m);k++)
        if(din[n][m][k]>ans)
            ans=din[n][m][k];

    cout<<ans<<'\n';
    return 0;
}