85092024-01-19 18:19:22URAQT420Tulipán csokrokcpp17Időlimit túllépés 62/1001.593s790708 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

	int n, k; cin>>n>>k;
	vector<long> v(n+1);
	vector<int> w(n+1);
	vector<vector<long> > dp(n+1, vector<long>(k+1));

	dp[0][1] = 1e9 + 1;
	stack<int> s;
	for(int i = 1; i <= n; ++i){
		cin>>v[i];
		if(s.empty())s.push(i);
		else{
			while(v[i-1] > v[i] && v[s.top()-1] > v[i]){
				s.pop();
			}
			if(v[i-1] < v[i])s.push(i);
		}
		w[i] = s.top();
		dp[i][1] = min(dp[i-1][1], v[i]);
	}

	dp[0][1] = 0;

	for(int j = 2; j <= k; ++j){
		for(int i = j; i <= n; ++i){
			if(w[i] == w[i-1]){
				dp[i-1][j-1] = max(dp[i-1][j-1], dp[i-2][j-1]);
			}else if(w[i] < w[i-1]){
				int temp = i-1;
				while(temp && w[temp] != w[i]){
					dp[i-1][j-1] = max(dp[i-1][j-1], dp[temp-1][j-1]);
					temp = w[temp] - 1;
				}
				dp[i-1][j-1] = max(dp[i-1][j-1], dp[temp-1][j-1]);
			}
			dp[i][j] = max(dp[w[i]-1][j], dp[i-1][j-1] + v[i]);

		}

	}

	cout<<dp[n][k]<<endl;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1828 KiB
2Elfogadva3ms2048 KiB
subtask212/12
3Elfogadva3ms2284 KiB
4Elfogadva3ms2516 KiB
5Elfogadva28ms15576 KiB
subtask325/25
6Elfogadva3ms2740 KiB
7Elfogadva3ms2952 KiB
8Elfogadva3ms3052 KiB
9Elfogadva3ms3164 KiB
10Elfogadva3ms3176 KiB
11Elfogadva3ms3164 KiB
subtask425/25
12Elfogadva3ms3200 KiB
13Elfogadva3ms3256 KiB
14Elfogadva3ms3400 KiB
15Elfogadva3ms3440 KiB
16Elfogadva3ms3772 KiB
17Elfogadva3ms3984 KiB
18Elfogadva3ms4184 KiB
19Elfogadva4ms5228 KiB
20Elfogadva4ms6916 KiB
subtask50/38
21Elfogadva953ms786560 KiB
22Elfogadva1.151s787584 KiB
23Elfogadva1.47s790708 KiB
24Időlimit túllépés1.592s399336 KiB
25Elfogadva995ms404724 KiB
26Elfogadva395ms170100 KiB
27Elfogadva50ms29440 KiB
28Elfogadva180ms76356 KiB
29Elfogadva769ms326580 KiB
30Időlimit túllépés1.593s321280 KiB
31Elfogadva1.266s789196 KiB
32Elfogadva1.177s788348 KiB