AcWing 1016. 最大上升子序列和
原题链接
简单
作者:
minux
,
2020-04-16 09:35:22
,
所有人可见
,
阅读 518
c++
#include <bits/stdc++.h>
using namespace std;
int main(){
// 最长上升子序列的变种问题
int n;
cin>>n;
int a[n];
for(int i=0; i<n; ++i) cin>>a[i];
int f[n];
memset(f, 0x00, sizeof f);
// f[i]表示以第i个数字为结尾的最长上升子序列的和
// 转移方程 f[i]=max(f[j])+a[i];
int maxS = a[0];
for(int i=0; i<n; ++i){
f[i]=a[i];
for(int j=0; j<i; ++j){
if(f[j]<f[i])
f[i]=max(f[i], f[j]+a[i]);
}
maxS = max(maxS, f[i]);
}
cout<<maxS<<endl;
return 0;
}
python
from typing import List
class Solution:
def main(self, n:int , a:List[int]):
f, res = a.copy(), 0
for i in range(n):
for j in range(i):
if a[j]<a[i]: f[i]=max(f[i], f[j]+a[i])
res=max(res, f[i])
return res
if __name__=='__main__':
n=int(input())
a=list(map(int, input().split()))
sol=Solution()
print(sol.main(n, a))