Pagini recente » Cod sursa (job #35246) | Cod sursa (job #2053193) | Cod sursa (job #1440868) | Cod sursa (job #1061785) | Cod sursa (job #2300899)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("sobo.in");
ofstream g ("sobo.out");
const long long INF = 10000000000000000;
char so[16][1001];
int n, l, cost[1005];
long long d[(1<<15)];
void citire ()
{
f >> n >> l;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < l; j++)
{
f >> so[i][j];
}
}
for (int i = 0; i < l; i++)
{
f >> cost[i];
}
}
long long maxmultimi (long long S, long long x)
{
int mult0 = 0, mult1 = 0;
for (int k = 0; k < n; k++)
{
if ((S & (1 << k)) && so[k][x] == '0')
{
mult0 |= (1<<k);
}
if ((S & (1 << k)) && so[k][x] == '1')
{
mult1 |= (1<<k);
}
}
if (mult0 == 0 || mult1 == 0) return INF;
return max(d[mult0], d[mult1]);
}
void fac_dinamica ()
{
for (int i = 1; i < (1<<n); i++)
{
if (i == (i & (-i)))
{
d[i] = 0;
}
else
{
long long val = INF;
for (int j = 0; j < l; j++)
{
val = min(val, cost[j] + maxmultimi(i, j));
}
///cout << i << " " << val << '\n';
d[i] = val;
}
}
g << d[(1<<n) - 1] << '\n';
}
int main()
{
citire();
fac_dinamica();
return 0;
}