Ответы пользователя по тегу Алгоритмы
  • Как оптимизировать перебор?

    Entii
    @Entii Автор вопроса
    #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)
    Если кому-то будет интересно, могу рассказать принцип работы в комментариях.
    Ответ написан
    Комментировать