单调递增单调递减都是一样的思想,在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; }