最長の昇順サブシーケンス「DailyQuestion」

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;
}

おすすめ

転載: blog.csdn.net/weixin_60789461/article/details/123324616