最大上升子序列

题目:

 


思路:

动态规划

把每一步都分开算

第f[i]的值就代表了

(取第 a[i] 的数作为子序列的最大值)

从1到 i-1 能取的子序列和的最大值

然后对于每一步的最大值进行比较

记录下最大值

然后输出答案


原样例:

 

样例的运行过程

f[i]中i从 f[1] 到 f[i] 的值

变化的过程图:


 

代码详解:

#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
int a[1006];//存给的数组
ll f[1006];//f[i]表达第i个数作为子序列的最大值
int main()
{
	int n;
	cin >> n;
	ll maxx = 0;
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int i = 0; i <= n; i++)
	{
		for (int j = i + 1; j <= n; j++)
		{
			if (a[j] > a[i])//如果改位置可以更新子序列中的最大值
			{
				f[j] = max(f[j], f[i] + a[j]);//更新取该位置的最大值
				maxx = max(maxx, f[j]);//取所有跟新完后的最大值
			}
		}
	}
	printf("%lld", maxx);//输出答案
	return 0;
}

 PS:我住长江头,君住长江尾。

posted @ 2022-03-07 21:16  CTGU-YOG  阅读(40)  评论(0)    收藏  举报