CCCPaste

Untitled

#include 
#include 
using namespace std;
int n, m;
int mat[6][6];
int one[6][6];
int cnt;
short dp[4][5][1 << 20];
short rec(int i, int j, int bitmask, int skok) {
    if(__builtin_popcount(bitmask) == cnt) {
        return 1;
    }
    if(dp[i][j][bitmask] != -1) {
        return dp[i][j][bitmask];
    }
    short result = 0;
    if(skok == 0) {
        for(int k = 0; k < n; k++) {
            if(k != i and !(bitmask & (1 << one[k][j])) and mat[k][j] == 1) {
                int new_mask = (bitmask | (1 << one[k][j]));
                result = max(result, rec(k, j, new_mask, 1));
            }
        }
    }
    else {
        for(int k = 0; k < m; k++) {
            if(k != j and !(bitmask & (1 << one[i][k])) and mat[i][k] == 1) {
                int new_mask = (bitmask | (1 << one[i][k]));
                result = max(result, rec(i, k, new_mask, 0));
            }
        }
    }
    return dp[i][j][bitmask] = result;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin >> n >> m;
    cnt = 0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            cin >> mat[i][j];
            if(mat[i][j] == 1) {
                one[i][j] = cnt;
                cnt++;
            }
        }
    }
    memset(dp, -1, sizeof dp);
    
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            if(mat[i][j] == 1) {
                if(rec(i, j, (1 << one[i][j]), 1) == true) {
                    cout << "DA" << endl;
                    return 0;
                }
            }
        }
    }
    cout << "NE" << endl;
    return 0;
}