#include <iostream>
#include <algorithm>
#include <math.h>
#include <sstream>
#include <string>
#include <iomanip>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
#include <vector>
#include <iterator>
using namespace std;
//defines
#define ll long long
#define usg unsigned
#define kap map
#define print(x, n) for(int for_loop = 0; for_loop < n; for_loop++){cout<<x[for_loop]<<' ';}cout<<endl;
#define read(x, n) for(int for_loop = 0; for_loop < n; for_loop++){cin>>x[for_loop];}
#define speed ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define ratdig(x) cout << fixed << setprecision(x);
#define xfixdig(x) cout << setprecision(x);
#define multi int t; cin>>t; presolve(); while(t--) solve()
#define single presolve(); solve(); return 0
#define rev(x) reverse(x.begin(), x.end())
#define all(x) x.begin(), x.end()
//functions
void yn(bool b)
{
if (b)
{
cout << "YES\n";
return;
}
cout << "NO\n";
}
ll gcd(ll a, ll b) {
if (a == 0)
return b;
if (b == 0)
return a;
return gcd(b % a, a);
}
ll lcm(ll a, ll b)
{
return (a * b) / gcd(a, b);
}
string to2(ll a)
{
string r = "";
for (ll i = a; i > 0; )
{
ll k = i % 2;
i /= 2;
char c = k + 48;
r += c;
}
if (a == 0)
{
r = "0";
}
rev(r);
return r;
}
ll binpow(ll a, ll b, ll mod = -1)
{
ll ans = 1;
while (b)
{
if ((b & 1) == 1)
{
ans *= a;
if (mod != -1)
ans %= mod;
}
b >>= 1;
a *= a;
if (mod != -1)
a %= mod;
}
return ans;
}
//body
void presolve()
{
}
const int N = 100005;
const int K = 105;
ll arr[N], sum[N];
pair<ll, ll> dp[K][N];//dp, max
void solve()
{
ll i, j, k, m, n;
cin >> n >> m;
for (i = 0; i < n; i++)
{
cin >> arr[i];
sum[i] = arr[i];
if (i > 0)
sum[i] += sum[i - 1];
}
k = arr[0];
dp[0][0].first = k;
dp[0][0].second = k;
for (i = 1; i < n; i++)
{
k = max(k, arr[i]);
dp[0][i] = { k , k };
//cout << k << ' ';
}
ll w = 0;
//cout << endl;
for (i = 1; i < m; i++)
{
dp[i][i] = { sum[i], max(arr[i], dp[i - 1][i - 1].second)};
for (j = i + 1; j < n; j++)
{
dp[i][j] = { dp[i - 1][j - 1].first + arr[j], arr[j] };
if (dp[i][j - 1].second > arr[j])
{
if (dp[i][j - 1].first < dp[i][j].first)
{
dp[i][j] = dp[i][j - 1];
}
else if (dp[i][j - 1].first == dp[i][j].first)
dp[i][j].second = max(dp[i][j - 1].second, dp[i][j].second);
}
else
{
if (dp[i][j - 1].first + arr[j] - dp[i][j - 1].second < dp[i][j].first)
{
dp[i][j] = dp[i][j - 1];
dp[i][j].first += arr[j] - dp[i][j - 1].second;
dp[i][j].second = arr[j];
}
else if (dp[i][j - 1].first + arr[j] - dp[i][j - 1].second == dp[i][j].first)
dp[i][j].second = max(dp[i][j].second, arr[j]);
}
/*cout << dp[i][j] << ' ';*/
}
/*cout << endl;*/
}
cout << dp[m - 1][n - 1].first << endl;
}
int main()
{
speed;
single;
multi;
return 0;
}
Compilation message
blocks.cpp: In function 'void solve()':
blocks.cpp:124:5: warning: unused variable 'w' [-Wunused-variable]
124 | ll w = 0;
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
2396 KB |
Output is correct |
5 |
Correct |
1 ms |
2396 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Incorrect |
1 ms |
2396 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
2396 KB |
Output is correct |
5 |
Correct |
0 ms |
2396 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Incorrect |
1 ms |
2512 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
2396 KB |
Output is correct |
5 |
Correct |
1 ms |
2396 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Incorrect |
1 ms |
2396 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
2396 KB |
Output is correct |
5 |
Correct |
1 ms |
2396 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Incorrect |
1 ms |
2396 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |