#include #include #include #include #include #include #include #include #include #include #include #include #include #define repd(i,a,b) for (int i=(a);i<(b);i++) #define rep(i,n) repd(i,0,n) #define var auto #define mod 1000000007 #define inf 1e9 #define nil -1 #define mp make_pair typedef long long ll; using namespace std; template inline void output(T a, int p) { if(p){ cout << fixed << setprecision(p) << a << "\n"; } else{ cout << a << "\n"; } } // end of template int main() { cin.tie(0); // source code ll N, M; cin >> N >> M; vector W(N); rep(i, N){ cin >> W[i]; } vector> dp(N + 1, vector(4, -inf)); // [何個選んだか][今いる頂点を選んだか,0番目を選んだか] vector> tmp(N + 1, vector(4, -inf)); // dp = tmpを繰り返す // 0: 今いる頂点を選んでいない and 0番目を選んでいない // 1: 今いる頂点を選んでいない and 0番目を選んだ // 2: 今いる頂点を選んだ and 0番目を選んでいない // 3: 今いる頂点を選んだ and 0番目を選んだ dp[0][0] = dp[1][3] = 0; repd(i, 1, N){ rep(j, N + 1){ tmp[j][0] = max(dp[j][0], dp[j][2]); tmp[j][1] = max(dp[j][1], dp[j][3]); if(j){ tmp[j][2] = max(dp[j - 1][0], dp[j - 1][2] + W[i - 1]); tmp[j][3] = max(dp[j - 1][1], dp[j - 1][3] + W[i - 1]); } } swap(dp, tmp); } int ret = -inf; dp[M][3] += W[N - 1]; rep(i, 4){ ret = max(ret, dp[M][i]); } output(ret, 0); return 0; }