动态规划做法:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int n,a[N],f[N];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
//状态表示: f[i]表示以第i个数字结尾的最长上升子序列长度,
//状态转移------------------------
for (int i = 1; i <= n; i++)
{
f[i] = 1;
for (int j = 1; j < i; j++)
{
if(a[i]>a[j])
f[i] = max(f[i], f[j] + 1);
}
}
//-----------------------------------
int res=0;
for(int i=1;i<=n;i++)
{
res=max(res,f[i]);
}
printf("%d", res);
return 0;
}
总结:
动态规划问题的共性:问题可以用不同的状态来描述,而每个状态都有一个共同的属性,我们的目标是求这个属性的最大或最小,以及属性取到这个值时的状态。
状态表示,一定要使状态易于划分,
一旦有了状态转移方程,问题将迎刃而解。