Codeforces Round #750 (Div. 2) E - Pchelyonok and Segments (dp)
Solution
定义
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 代表:
从下标 i 到下标 n 区间内,将区间分为 j 段,第一段(即长度为 j 的一段)的最大值
定义
s
u
m
[
i
]
sum[i]
sum[i] 代表:
a
[
1
]
+
.
.
.
+
a
[
i
]
a[1]+...+a[i]
a[1]+...+a[i] 的区间和。
转移方程:
i
f
(
s
u
m
<
d
p
[
i
+
j
]
[
j
−
1
]
)
:
if(sum<dp[i+j][j-1]):
if(sum<dp[i+j][j−1]):
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
+
1
]
[
j
]
,
s
u
m
)
dp[i][j]=max(dp[i+1][j],sum)
dp[i][j]=max(dp[i+1][j],sum)
其
中
,
s
u
m
=
a
[
i
]
+
.
.
.
+
a
[
i
+
j
−
1
]
其中,sum=a[i]+...+a[i+j-1]
其中,sum=a[i]+...+a[i+j−1]
e
l
s
e
:
else:
else:
d
p
[
i
]
[
j
]
=
d
p
[
i
+
1
]
[
j
]
dp[i][j]=dp[i+1][j]
dp[i][j]=dp[i+1][j]
代码
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
//#define int long long
#define lowbit(x) ((x) & (-x))
using namespace std;
typedef pair<int, int> pii;
typedef pair<long, long> pll;
typedef pair<double, int> pdi;
typedef double dd;
typedef long long ll;
const int MAXN = 100515;
const int MAXM = 3000010;
const dd eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
ll a[MAXN], dp[MAXN][510], sum[MAXN];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n;i++)
for (int j = 1; j <= 500;j++)
dp[i][j] = 0;
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]), sum[i] = 0, sum[i] = sum[i - 1] + a[i];
dp[n][1] = a[n];
for (int i = n - 1; i >= 1;i--)
{
dp[i][1] = max(a[i], dp[i + 1][1]);
for (int j = 2; j <= 500 && i + j <= n; j++)
{
dp[i][j] = dp[i + 1][j];
if (i + j <= n && sum[i + j - 1] - sum[i - 1] < dp[i + j][j - 1])
{
dp[i][j] = max(dp[i][j], sum[i + j - 1] - sum[i - 1]);
}
}
}
ll k = 1;
for (int i = 1; i <= 500;i++)
{
if(dp[1][i]!=0)
k = i;
}
printf("%lld\n", k);
}
}