数字三角形
#include <iostream>
using namespace std;
const int N = 510;
int n, m;
int a[N][N];
int f[N][N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j ++)
cin >> a[i][j];
for (int i = n, j = 1; j <= n; j++)
f[i][j] = a[n][j];
for (int i = n; i >= 1; i--)
for (int j = 1; j <= i; j++)
f[i][j] = a[i][j] + max(f[i + 1][j], f[i + 1][j + 1]);
cout << f[1][1] << endl;
return 0;
}
最长上升子序列
- 状态表示:
f[i]
表示从第一个数字开始算,以a[i]
结尾的最大的上升序列。(以a[i]
结尾的所有上升序列中属性为最大值的那一个)
- 状态计算(集合划分):
j∈(0,1,2,..,i-1)
, 在a[i] > a[j]
时, f[i] = max(f[i], f[j] + 1)
。 有一个边界,若前面没有比i小的,f[i]为1(自己为结尾)。
- 最后在找f[i]的最大值。
O ( n 2 ) 状 态 数 ( n ) ∗ 转 移 数 ( n ) O(n^2)状态数(n) * 转移数(n) O(n2)