895. Самая длинная восходящая подпоследовательность - Банк вопросов AcWing
#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;
}