895.最長昇順部分列-AcWingQuestionBank
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <stdio.h>
#define int long long
using namespace std;
const int N=1e3+10;
const int mod=1e9+7;
int arr[N];
// int dp[N][N];
int f[N];
int ans=0;
//到达n的长度
//上升子序列
//最大上升子序列
signed main() {
int n;cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",&arr[i]);
//f[i]是以i为结尾的最长上升子序列的长度
//一开始最长上升子序列当然都是1
//然后就每次开始判断,是不是满足最长上升子序列的条件arr[i]>arr[j]
//以i为结尾,和前面进行比较操作
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<=n;j++)
{
if(arr[i]>arr[j]) f[i]=max(f[i],f[j]+1);
}
ans = max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}
高度:
最大および昇順のサブシーケンス-質問-Daimayuanオンラインジャッジ
ここで、最長の昇順サブシーケンスの長さを尋ねる代わりに、最長の昇順サブシーケンスに重みを付けて、最大の累積項を見つけます。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <stdio.h>
#define int long long
using namespace std;
const int N=1e3+10;
const int mod=1e9+7;
int arr[N];
int dp[N][N];
int f[N];
int ans=0;
//到达n的长度
//上升子序列
//最大上升子序列
signed main() {
int n;cin>>n;
for(int i=1;i<=n;i++)
{scanf("%lld",&arr[i]);}
memset(f, 0, sizeof(f));
f[1]=arr[1];
for(int i=1;i<=n;i++){
// f[i]=1;
for(int j=1;j<=n;j++)
{
//f[i]是以i为结尾的最长上升子序列的长度,
if(arr[i]>arr[j]) f[i]=max(f[i],f[j]+arr[i]);
}
ans = max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}