Advertisement
Josif_tepe

Untitled

Sep 18th, 2022
696
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <queue>
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7.  
  8. int n,m;
  9. int mat[5][6];
  10. int kolku;
  11. short dp[4][5][(1<<20)];
  12. int idx[5][6];
  13.  
  14. int f(int i,int j,int k)
  15. {
  16.     if(__builtin_popcount(k) == kolku) {
  17.         return true;
  18.     }
  19.     if(dp[i][j][k] != -1) {
  20.         return dp[i][j][k];
  21.     }
  22.     int bits = __builtin_popcount(k);
  23.     int result = 0;
  24.     if(bits % 2 == 1) {
  25.         for(int p = 0; p < m; p++) {
  26.             if(p != j and mat[i][p] == 1) {
  27.                 if(!(k & (1 << idx[i][p]))) {
  28.                     result = max(result, f(i, p, (k | (1 << idx[i][p]))));
  29.                 }
  30.             }
  31.         }
  32.     }
  33.     else {
  34.         for(int p = 0; p < n; p++) {
  35.             if(p != i and mat[p][j] == 1) {
  36.                 if(!(k & (1 << idx[p][j]))) {
  37.                     result = max(result, f(p, j, (k | (1 << idx[p][j]))));
  38.                 }
  39.             }
  40.         }
  41.     }
  42.     return dp[i][j][k]=result;
  43. }
  44.  
  45. int main()
  46. {
  47.     cin>>n>>m;
  48.     kolku = 0;
  49.     for(int i=0;i<n;i++)
  50.     {
  51.         for(int j=0;j<m;j++)
  52.         {
  53.             cin>>mat[i][j];
  54.             if(mat[i][j]==1)kolku++;
  55.         }
  56.     }
  57.     int cnt=0;
  58.     for(int i=0;i<n;i++)
  59.     {
  60.         for(int j=0;j<m;j++)
  61.         {
  62.             if(mat[i][j]==1)
  63.             {
  64.                 idx[i][j]=cnt;
  65.                 cnt++;
  66.             }
  67.             else
  68.             {
  69.                 idx[i][j]=0;
  70.             }
  71.         }
  72.     }
  73.     memset(dp,-1,sizeof dp);
  74.     bool ok=false;
  75.     for(int i=0;i<n;i++)
  76.     {
  77.         for(int j=0;j<m;j++)
  78.         {
  79.             if(mat[i][j]==1)
  80.             ok=f(i,j,(1<<(idx[i][j])));
  81.             if(ok)break;
  82.         }
  83.         if(ok)break;
  84.     }
  85.     if(ok)cout<<"DA"<<endl;
  86.     else cout<<"NE"<<endl;
  87.     return 0;
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement