1.问题:
有这样一串数字,1,4,7,5,6,2,8,9,3,0 ,
如何求出它的最长上升子串数目?
比如:它会有若干子串
1,4,7,8,9
1,6,9
…
1,4,5,6,8,9
等等若干
其中最长的上升串1,4,5,6,8,9****数目为6
2.方法:
2.1 每次当前位置找前面中比当前位置小的元素的对应maxlen中最大的值;
说明:
2.1.1 最开始num[0]中1前面没有,那么maxlen[0]中就是1,
然后4是当前位置,前面只有1,就是1对应maxlen中值加1为2。
7又变成当前位置,找到4,对应2+1=3(字串 1,4,7的数目就是3)
...8成为当前位置,找到6对应4,那么4+1=5;
2.1.2 上面为什么8找的不是7,因为前面都比它小,
要小的对应maxlen中值最大,7对应3,6对应4.
所以选择6对应的值
2.1.3 我把整个图画在下面,就是每个num中的值对应maxlen中的值
然后挑出,maxlen中最大值就可以啦
3.代码如下:
#include<stdio.h>
//.....最长上升子串数目.....//
//.....1,4,7,5,6,2,8,9,3,0 ....//
//....要满足从左到右依次上升..//
int maxUpNum(int num[],int len)
{
int maxlen[10] = { 1 };
for (int i = 1; i <len; i++)
{
int temp = 0;
for (int j = 0; j < i; j++)
{
if (num[i] > num[j])
{
if (temp < maxlen[j])
{
temp = maxlen[j];
}
}
maxlen[i] = temp + 1;
}
}
for (int i = 0; i < len; i++)
{
printf("maxlen[%d]:%d\n", i, maxlen[i]);
}
//....找出最大的值.....//
int maxValue = maxlen[0];
for (int i = 1; i < len; i++)
{
if (maxValue< maxlen[i])
maxValue = maxlen[i];
}
return maxValue;
}
int main()
{
int num[10] = { 1,4,7,5,6,2,8,9,3 ,0};
printf("最长上升子串长度:%d\n", maxUpNum(num,10));
return 0;
}