#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define pb push_back #define pp pop_back #define f first #define s second #define mp make_pair #define sz(a) int((a).size()) #ifdef _WIN32 # define I64 "%I64d" #else # define I64 "%lld" #endif #define fname "." #define pi pair < int, int > typedef long long ll; typedef unsigned long long ull; const int MAX_N = (int)5e5 + 123; const int inf = (int)1e9 + 123; using namespace std; int n, k; int a[MAX_N]; int used[(1 << 23)]; ll res[(1 << 23)]; ll dp[MAX_N]; ll solve(int mask) { if (used[mask] == 2) return res[mask]; ll &ans = res[mask]; used[mask] = 1; if (!mask) { used[mask] = 2; return ans = 0; } ans = (ll)1e18 + 123; for (int i = 0; i < n; i++) { int nwmask = mask; for (int j = max(0, i - k); j <= min(n - 1, i + k); j++) nwmask ^= (1 << j); if (used[nwmask] != 1) ans = min(ans, solve(nwmask) + a[i]); } used[mask] = 2; return ans; } int main() { #ifdef Nick freopen(fname"in","r",stdin); freopen(fname"out","w",stdout); #endif scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) scanf("%d", &a[i]); if (n > 20) { for (int i = n; i > 0; i--) a[i] = a[i - 1]; for (int i = 1; i <= n; i++) { dp[i] = (ll)1e18; if (i - k <= 1) dp[i] = a[i]; else { for (int j = i - 1; j >= max(1, i - 2 * k - 1); j--) dp[i] = min(dp[i], dp[j] + a[i]); } } ll res = (ll)1e18 + 123; for (int i = max(1, n - k); i <= n; i++) res = min(res, dp[i]); cout << res; return 0; } cout << solve((1 << n) - 1); return 0; }