您的位置:首页 > 其它

动态规划专练4 最长上升子序列

2017-12-25 22:10 246 查看
问题描述

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

思路:以dp[i]表示以a[i]元素结尾的子序列(其中a[i]>a[j]且i>j)的最大长度,则dp[i]有两种情况:dp[j]+1大还是dp[i]原来就大,一直保持最大长度即可。
——————————————————————————————————————————————————————————————————————————
#include <stdio.h>
int input[1000];//输入串
int dp[1000];//保存每一个元素的最大子序列长度
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j;
for(i=0;i<n;i++)
{
scanf("%d",&input[i]);
dp[i]=1;//更新最小为一
}
int max=0;
for(i=0;i<n;i++)//外层循环n个元素
{
for(j=0;j<i;j++)//内层枚举该元素以前的元素长度(子序列)
{
if(input[i]>input[j])
dp[i]=dp[i]>dp[j]+1?dp[i]:dp[j]+1;//保持最大长度(如2534176    1后面的7对于1是不更新的,因为dp[4]+1<dp[5](也就是7),所以这里要判断,保持最大!!)

}
max=max>dp[i]?max:dp[i];//更新最大值
}
printf("%d\n",max);

}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: