单调递增最长子序列(非连续)

单调递增最长子序列

时间限制:3000 ms | 内存限制:65535 KB

描述

求一个字符串的最长递增子序列的长度

如:dabdbf最长递增子序列就是abdf,长度为4

输入

第一行一个整数0<n<20,表示有n个字符串要处理
 
随后的n行,每行有一个字符串,该字符串的长度不会超过10000

输出

输出字符串的最长递增子序列的长度

样例输入
 
 
  1. 3
  2. aaa
  3. ababc
  4. abklmncdefg
样例输出
数组f[i]表示到下标为i的字符为止的最长递增子序列序列的长度
 
 
  1. 1
  2. 3
  3. 7
  1. #include<iostream>
  2. #include<string>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7. int t;
  8. string s;
  9. cin >> t;
  10. while(t--){
  11. cin >> s;
  12. int ans = 0, f[10000];
  13. for(int i = 0, len = s.length(); i < len; ++i){
  14. int max = 0;
  15. for(int j = 0; j < i; ++j){
  16. if(s[j] < s[i] && max < f[j]){
  17. max = f[j];
  18. }
  19. }
  20. if((f[i] = max + 1) > ans){
  21. ans = f[i];
  22. }
  23. }
  24. cout << ans << "\n";
  25. }
  26. return 0;
  27. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值