现在的位置: 首页 > 综合 > 正文

动态规划之单调递增最长子序列

2014年07月27日 ⁄ 综合 ⁄ 共 699字 ⁄ 字号 评论关闭

单调递增单调递减都是一样的思想,在oJ上看到的题目。自己想出来的,感觉蛮好。

求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4

我的第一思路就是动态规划求,后来看到还有一麻烦的思路就是求公共最长子串,和26个英文字母的顺序。。。这思路只适用这题,不适用其他的,比如后来遇到的导弹拦截问题,矩形的嵌套问题,都是一样的思路。

首先是找最优子结构,开始考虑简单了,只考虑了相邻的字符,后来发现不行。

后来划了几下才想到的,当前的字符和前面所有字符比较,找出前面所有字符中小于当前字符的,在找出它们当中的最大值,再将这个最大值加一,就是当前位置的最长递增子串。(= =语文不大好,应该看得懂吧)

贴代码:

由于是oj上直接提交的代码,没什么注释。。

 
#include<iostream>
#include<string>
#define Max 10005
using namespace std;
//单调递增最长子序列
int a[Max];
string data;
int main()
{
	int n;
	cin>>n;
	cin.clear();
	cin.sync();
	while(n--)
	{
		int i,max=1,j;
		cin>>data;
		for(i=0;i<=data.length();i++)
			a[i]=1;
		for(i=2;i<=data.length();i++)
		{

			for(j=0;j<i-1;j++)
				if(data[i-1]>data[j])
				{
					int t=a[j+1]+1;
					a[i]=a[i]>t?a[i]:t;
				}
			max=max>a[i]?max:a[i];
		}
		cout<<max<<endl;
	}
	return 0;
}        
【上篇】
【下篇】

抱歉!评论已关闭.