思路:
这道题一看就是道动规。再看数据范围肯定是
O
(
n
2
)
O(n^2)
O(n2)的做法。所以我们用类似于
L
I
S
LIS
LIS的做法来做这道题。
我们观察可以发现,我们所处的节点就是前面任意一个符合要求的节点跳转过来的。所以,转移方程为:
f
[
i
]
=
m
a
x
(
a
[
i
]
+
f
[
j
]
,
f
[
i
]
)
f[i] = max(a[i] + f[j], f[i])
f[i]=max(a[i]+f[j],f[i])
在此之前,我们需要对
f
[
i
]
f[i]
f[i]赋初值,即
f
[
i
]
=
a
[
i
]
f[i] = a[i]
f[i]=a[i]
提示: 此题要开
l
o
n
g
l
o
n
g
long\ long
long long!
代码如下:
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
template < typename T > void read(T &x)
{
int f = 1;x = 0;char c = getchar();
for (;!isdigit(c);c = getchar()) if (c == '-') f = -f;
for (; isdigit(c);c = getchar()) x = x * 10 + c - '0';
x *= f;
}
long long f[1001], a[1001], n;
int main()
{
freopen("checkpoint.in", "r", stdin);
freopen("checkpoint.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
long long ans = 0;
for (int i = 1; i <= n; i++)
f[i] = a[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j < i; j++)
if(a[j] < a[i])
f[i] = max(a[i] + f[j], f[i]);
for(int i = 1;i <= n;i++)
ans = max(ans, f[i]);
cout << ans << endl;
return 0;
}