例1
#include <iostream>
using namespace std;
const int N = 1010;
int a[N];//存储数据
int f[N];//f[i]表示对应的a[i]的最长上升序列
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
for (int i = 1; i <= n; i ++ )
{
f[i] = 1;
for (int k = 1; k < i; k ++ )
if (a[k] < a[i]) f[i] = max(f[i], f[k] + 1);//a[i]>a[k],那么f[i]可等于f[k]+1(将a[i]加入截止到a[k]的最长序列)
}
int res = 0;
for (int i = 1; i <= n; i ++ )
res = max(res, f[i]);
cout << res << endl;
return 0;
}
当程序运行到a[i]时,会比较a[0]--a[i-1],当遇到比a[i]小的数a[k]时就会更新f[i]为f[i]和f[k]+1之间的最大值,图中样例得到的f[i]={1 1 2 1 3 3 4 },所以最大上升子序列长度为4;
例二
#include<iostream>
using namespace std;
int n;
const int N=505,INT=1e9;
int f[N][N],g[N][N];//数组g用于存储输入数据,数组f用于存储数组g运算至相应位置的最大值
int main(){
cin>>n;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
f[i][j]=-INT;//初始化,因为数据中存在负数,所以需要将其初始化为一个极小值
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= i; j ++ )
cin >> g[i][j];
f[1][1]=g[1][1];
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + g[i][j];//保证对应位置选择当前最大值的路线
int res = -INT;
for (int i = 0; i <= n; i ++ )
res = max(res, f[n][i]);
cout << res << endl;
return 0;
}