NYOJ - 17 - 单调递增最长子序列(动态规划--LIS--单调递增最长子序列)

本文介绍了一种求解字符串最长递增子序列长度的方法,通过动态规划算法实现,并提供了详细的实现步骤及AC代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7


思路:设dp[i]是前i个字符组成的最长递增子序列的长度。dp[1]=1; 试想,求第i个字符的最长递增子序列的长度时,扫描前i-1个字符j,如果s[i]>s[j]那么s[i]可以添加到dp[j]后面,这时dp[i] = dp[j]+1,那么我们想得到最大的dp[i],就需要得到最大的dp[j]加上1就是dp[i]。

其中容易犯的错误是1.扫描前i-1个字符的时候,判断语句容易写错。2.寻找最大上升递增子序列的时候直接返回以最后一个字符结束的最大上升递增子序列。



void LIS(String s){
	for(int i=1 ;i<s.length() ;i++){
		dp[i] = 1;
		for(int j=0 ;j<i ;j++){
			if(s[j]<s[i]){
//错误1			dp[i] = max(dp[j]+1,1);  
				dp[i] = max(dp[j]+1,dp[i]);
			}
		}
		ans = max(ans,dp[i]);
	}
//错误2		ans = dp[s.length()-1];
}

AC代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
string s;
int n,dp[10005],ans;

int main(){
	scanf("%d",&n);
	while(n--){
		cin>>s;
		dp[0] = 1;
		ans = 1;
		for(int i=1 ;i<s.length() ;i++){
			dp[i] = 1;
			for(int j=0 ;j<i ;j++){
				if(s[j]<s[i]){
					dp[i] = max(dp[j]+1,dp[i]);
				}
			}
			ans = max(ans,dp[i]);
		}
		printf("%d\n",ans);
	}
	
	
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值