动态规划,最长递增子序列(不是非递减子序列);做法很简单,直接按照模板做就行了,主要是要想明白其中的道理,用什么存取加入第 i 个长度后当前的最长递增长度。两层循环,i 表示对第 i 个长度进行考察,j 表示对于 longer[i] 进行递增长度确定;写个状态转移方程就都明白了!
状态转移方程:
longer[i] = max{num[j]+1;其中1<j < i};
不知道对不对,总之就是这个意思吧!见笑了!!!
#include <iostream>
using namespace std;
int num[10001];
int longer[10001];
int longest;
int more_longer = 1;
int main ()
{
int N;
cin >> N;
int i ,j;
for ( i = 0;i < N;i++)
scanf("%d", &num[i]);
for (i = 1;i < N; i++) //核心代码开始,算法推敲从这里开始!
{
longest = 1;
longer[0] = 1;
for (j = 0;j < i; j++)
{
if (num[j] < num[i])
if (longest <= longer[j]+1)
longest = longer[j] + 1;
} //核心代码结束,相信没有什么问题;有问题留言;
longer[i] = longest;
if (more_longer < longest)
more_longer = longest;
}
cout << more_longer << endl;
return 0;
}