/*
LANG: C++
TASK: books
*/

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <limits>

using std::cout;

const int MAXN = 256;
const int MAXK = 128;

int N, K;
long long s[MAXN];
long long d[MAXN];
long long sd[MAXN][MAXN];

long long opt[MAXN][MAXK];

int main () {
    scanf ("%d%d", &N, &K);

    int i, j, k;
    for (i = 0; i < N; ++i)
        scanf ("%d", &s[i]);
    for (i = 0; i < N; ++i)
        scanf ("%d", &d[i]);

    for (i = 0; i < MAXN; ++i)
        for (j = 0; j < MAXN; ++j)
            sd[i][j] = 0;

    for (i = 0; i < N; ++i) {
        sd[i][0] = d[0] * s[i];
        for (j = 1; j < N-i; ++j)
            sd[i][j] = sd[i][j-1] + d[j] * s[i+j];
    }
    
    
/*    for (i = 0; i < N; ++i) {
        printf ("%d ->", i);
        for (j = 0; j < N-i; ++j)
            printf (" %d", sd[i][j]);
        printf ("\n");
    }
*/

    long long min;

    for (i = 0; i < MAXN; ++i) {
        opt[i][0] = std::numeric_limits<long long>::max();
        for (j = 1; j < MAXK; ++j)
            opt[i][j] = 0;
    }
    opt[0][0] = 0;

    for (i = 1; i <= N; ++i) {
        opt[i][1] = sd[0][i-1];
        for (j = 2; j <= K; ++j) {
            min = std::numeric_limits<long long>::max();
            for (k = 0; k < i; ++k) {
//                printf ("opt[%d][%d] + sd[%d][%d] == %lld\n", k, j-1, k, i-k-1, opt[k][j-1] + sd[k][i-k-1]);
//                cout << "opt[" << k << "][" << j-1 << "] + sd[" << k << "][" << i-k-1 << "] = " << opt[k][j-1] + sd[k][i-k - 1] << '\n';
//                cout << "min == " << min << '\n';
                if (opt[k][j-1] + sd[k][i-k - 1] < min) {
//                   printf ("here!\n");
                    min = opt[k][j-1] + sd[k][i-k - 1];
//                    cout << "now min == " << min << '\n';
                }
            }
//            cout << "after -> min == " << min << '\n';
            if (min > opt[i][j-1])
                min =  opt[i][j-1];
//            cout << i << ' ' << j << ' ' << min << '\n';
//            printf ("%d %d %d\n", i, j , min);
            opt[i][j] = min;
        }
    }
//    printf ("N == %d, K == %d\n", N, K);

/*    for (i = 1; i <= N; ++i) {
        printf ("%d -> ", i);
        for (j = 1; j <= K; ++j)
            printf (" %d", opt[i][j]);
        printf ("\n");
    }
*/
//    printf ("%lld\n", opt[N][K]);
    cout << opt[N][K] << '\n';

    return 0;
}
