Cod sursa(job #1824324)

Utilizator Emil64Emil Centiu Emil64 Data 7 decembrie 2016 18:34:08
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<cstdio>
#include<vector>
using namespace std;
long long ap[251][251], dp[2][(1<<15)+3][16];
long long l, aux, p, s, i, j, x, y, n, m, poz, k, t ;
vector < int > h[18];
int main()
{
freopen("ture.in","r",stdin);
freopen("ture.out","w",stdout);
scanf("%d%d%d%d", &n, &m, &p, &poz);
for(i = 1;i <= poz; i++)
{
    scanf("%d%d", &x, &y);
    if(n<m)
    {
        aux=x;
        x=y;
        y=aux;
    }
    ap[x][y]=1;
}
if(n<m)
{
    aux=n;
    n=m;
    m=aux;
}
for(i = 0;i < (1<<m); i++)
{
    t = 0;
    for(j = 0;j < m;j++)
        if(i& (1 << j)) t++;
    h[t].push_back(i);
}
for(i = 1;i <= n; i++)
{
    for(j = 1;j <= m; j++)
    {
        if(ap[i][j] == 0)
            dp[i % 2][(1 << (j-1))][1] = 1 + dp[(i-1) % 2][(1 << (j-1))][1];
        else
            dp[i % 2][(1 << (j-1))][1] = dp[(i-1) % 2][(1 << (j-1))][1];
    }
    for(k = 2;k <= p && k <= i; k++)
        for(l = 0;l < h[k].size(); l++)
        {
            j = h[k][l];
            dp[i % 2][j][k] = dp[(i-1) % 2][j][k];
            for(t = 1; t<= m; t++)
                if((j & (1 << (t-1))) > 0&& ap[i][t] == 0)
                    dp[i % 2][j][k] += dp[(i-1) % 2][j-(1<< (t-1))][k-1];
        }
}
s=0;
for(j=0;j < h[p].size(); j++)
    s += dp[n % 2][h[p][j]][p];
printf("%lld\n",s);
return 0;
}