SRM364 div2 hard

n<=16とかビットですよって言ってるようなもの

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

class PowerPlants
{
	public:
		int n,aim;
		int cache[(1<<16)];
		vector<string> cost;

		int popCount(int num)
		{
			int r=0;
			for(int i=0;i<n;i++)
				if(num & (1<<i))
					r++;
			return r;
		}

		int rec(int state)
		{
			int &r=cache[state];
			if(r!=-1)
				return r;
			if(aim <= popCount(state))
				return r=0;

			r=(1<<28);
			for(int i=0;i<n;i++)
			{
				if(state & (1<<i))
					continue;

				for(int j=0;j<n;j++)
					if(state & (1<<j))
						r=min(r,cost[j][i]+rec( (state | (1<<i)) ));
			}

			return r;
		}

		int minCost(vector<string> _cost,string active,int _aim)
		{
			cost=_cost;
			n=cost.size();
			for(int i=0;i<n;i++)
				for(int j=0;j<n;j++)
				{
					char c=cost[i][j];
					if('0'<=c && c<='9')
						c-='0';
					else if('A'<=c && c<='Z')
					{
						c-='A';
						c+=10;
					}
					cost[i][j]=c;
				}
			aim=_aim;

			fill(&cache[0],&cache[(1<<n)],-1);

			int state=0;
			for(int i=0;i<n;i++)
				if(active[i]=='Y')
					state=( state | (1<<i) );

			return rec(state);
		}
};