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