ASSIGN - Assignments - SPOJ Solution C++

Problem Link : ASSIGN

 

Hint : DP with Bitmasking

 

C++ Solution :

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
 
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		ll size=pow(2,n);
		ll dp[size];
		memset(dp,0,sizeof(dp));
		bool arr[n][n];
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
				cin>>arr[i][j];
		}
		dp[0]=1;
		int cnt;
		for(int i=0;i<size;i++)
		{
			cnt=__builtin_popcount(i);
			for(int j=0;j<n;j++)
				if(!(i&(1<<j)) && arr[cnt][j])
					dp[i|(1<<j)]+=dp[i];
		}
 
		cout<<dp[size-1]<<"\n";
	}
}