方法1:覆盖法
#include<iostream> #include<string.h> using namespace std; char a[10001]; char b[10001]; int main() { int n; cin>>n; while(n--) { int len, sum = 1, i, j; //sum是最优解的个数 cin>>a; len = strlen(a); b[0] = a[0]; //循环需要比较,则先赋值 for(i = 0; i < len; ++i) //对第i个元素操作 { for(j = sum -1; j >= 0; --j) //从后先前,查找要覆盖的元素的下标 { if(a[i] > b[j]) //满足条件则续尾,不满足条件覆盖 break; } b[j + 1] = a[i]; if(j == sum -1) sum++; //续尾后最大长度+1 } cout<<sum<<endl; } return 0; }
方法2:新数组记录字串长度
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int m; cin>>m; while(m--) { int a[10010], i; string str; cin>>str; for(i = 0; i != str.size(); i++) { a[i] = 1; for(int j = 0; j < i; j++) { if((str[j] < str[i]) && (a[i] < a[j] + 1)) //a[i]<a[j]+1:求得第i个元素前最长公共子序列长度的限制条件 a[i] = a[j] + 1; //递推 } } cout<<*max_element(a, a + i)<<endl; } return 0; }
优化方法:
在查找要覆盖的元素j的下标时,使用二分查找即可。