动态规划之寻找最长上升子串问题

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;
}

4.测试结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲折耳根的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值