#include <fstream>
using namespace std;
typedef long long x;
x N,M,K,j,I,A[11];
char p[2<<17][10];
x z(x i, x l, x r)
{
x m=x(2)<<35,t;
if (i>=M || l>=r)
m=0;
else
{
x L=l,R;
for (x c=48;c<K;c++)
{
for (R=L;R<r && p[R][i]==c; R++)
;
if (t=z(i+1,L,R), t<m)
m=t;
L=R;
}
}
return m+A[i]*(r-l);
}
int main()
{
fstream i("input.txt"),o("output.txt");
i>>N>>M>>K;
K+=48;
for (;I<M;I++)
i>>A[I+1];
for (;I>1;I--)
A[I]-=A[I-1];
for (;j<N;j++)
i>>p[j];
o<<z(0,0,N);
}
Моё решение. Справилось с самым худшим раскладом довольно шустро, используется разумный перебор вариантов.
P.S. для рекорда требовалось написать самое короткое решение, поэтому код такой.
P.S.S. в некоторых компиляторах требуется изменить
o("output.txt")
на
o("output.txt",2)
Если кому-то будет интересно, могу рассказать принцип работы в комментариях.