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

来源:互联网 发布:深圳中广核设计院 知乎 编辑:程序博客网 时间:2024/06/03 16:00

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

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

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

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

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

贴代码:

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

 #include<iostream>#include<string>#define Max 10005using 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;}        


0 0