题意
给定一个链表结构,每个节点有一个权值,从第一个节点出发,可以往后跳到任意节点上,但是该节点的权值必须必当前节点的权值大。问:经过节点的权值总和最大为多少。
时间复杂度分析
由于每个节点的最优值,只与前面节点相关,很容易想到动态规划。
dp[i]表示以第i个节点为终点,最优解为多少。
状态转移函数为:
d
p
[
i
]
=
max
v
a
l
u
e
[
j
]
<
v
a
l
u
e
[
i
]
∧
j
<
i
(
v
a
l
u
e
[
j
]
)
+
v
a
l
u
e
[
i
]
dp[i]=\max_{value[j]<value[i] \wedge j<i}(value[j])+value[i]
dp[i]=maxvalue[j]<value[i]∧j<i(value[j])+value[i]。
实现
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int dp[N],a[N];
int main(){
int n;
while(cin>>n&&n){
for(int i=1;i<=n;i++) cin>>a[i];
int maxv=0;
for(int i=1;i<=n;i++){
dp[i]=a[i];
for(int j=1;j<i;j++){
if(a[i]>a[j]){
dp[i]=max(dp[i],dp[j]+a[i]);
}
}
maxv=max(maxv,dp[i]);
}
cout<<maxv<<endl;
}
return 0;
}