题目:
思路:
动态规划
把每一步都分开算
第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:我住长江头,君住长江尾。