题意见标题
首先我们来看这样一个例子一段数列
a
1
a
2
a
3
⋅
⋅
⋅
a
n
a_1 \ a_2 \ a_3 \ ··· a_ n
a1 a2 a3 ⋅⋅⋅an
现在求取一段上升子序列的最大值
现在我们令
d
p
[
i
]
dp[i]
dp[i]表示从数组开头到第i个数一段上升子序列的最大值
那么我们很快得到状态转移方程
d
p
[
i
]
=
m
a
x
(
d
p
[
j
]
(
j
=
1...
i
−
1
)
)
+
a
[
i
]
(
a
[
i
]
>
a
[
j
]
)
dp[i] = max(dp[j](j=1...i-1))+a[i] \ (a[i]>a[j])
dp[i]=max(dp[j](j=1...i−1))+a[i] (a[i]>a[j])现在以下图做例
令设 i = 3;
那么考察3之前的一段上升子序列的最大值,如果有a[i]<a[3];那么意味着a[3]可以加入dp[i]其中,将其变成dp[3];
code:
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int a[1005];
int dp[1005];
signed main(){
int t;
while(1){
cin>>t;
if(t==0) break;
for(int i=1;i<=t;i++)
{
cin>>a[i];
}
int ans = 0;
for(int i=1;i<=t;i++)
{
int maxn = 0;
for(int j=1;j<i;j++)
{
if(a[j]<a[i]){//状态转移方程
maxn = max(maxn,dp[j]);
}
}
dp[i] = maxn+a[i];
}
for(int i=1;i<=t;i++)
ans = max(ans,dp[i]);
cout<<ans<<endl;
}
}