| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 30869 | Accepted: 13465 |
7 1 7 3 5 9 4 8
4
解题思路:这一题刚开始有点卡住了,可能最近相同类型的题目做的有点多。最后看了提示想到的方法,不用递归去做。原题中要我们求解最大上升子序列,那么我们可以把问题分解为以求第 i 个数为结尾的子序列的最大上升子序列。而第i个数的解和前面i-1个数的解是存在联系的,这就是解题的核心。知道前面i-1个数的解后来求第i个数,我们只要和前面i-1个数相比找到比第i个数小且其解最大的值max,max+1就是第i个数的解!
// 最长上升子序列.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<memory.h>
using namespace std;
int a[1010]={0};
int len_[1010]={0};
int main()
{
int n=0;
int max_=0;
while(scanf("%d",&n)!=EOF)
{
int i=0;
max_=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
len_[i]=1;
}
for(i=1;i<n;i++)
for(int j=0;j<i;j++)
if(a[i]>a[j])
{
len_[i]=max(len_[j]+1,len_[i]);
}
for(i=0;i<n;i++)
if(len_[i]>max_)
max_=len_[i];
printf("%d\n",max_);
}
return 0;
}
经典动态规划问题--最长上升子序列 POJ--2533,布布扣,bubuko.com
原文:http://blog.csdn.net/linsheng9731/article/details/23862077