蓝桥杯官网 试题 PREV-255 历届真题 蓝肽子序列【第十一届】【决赛】【研究生组】【C++】【Java】【Python】三

举报
红目香薰 发表于 2022/05/31 18:40:00 2022/05/31
【摘要】 ​ 为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。今年的最大目标就是能为【一亿技术人】创造更高的价值。资源限制内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s​编辑​编辑C++# include <stdio.h># inclu...

 为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

编辑编辑

C++

# include <stdio.h>
# include <string.h>
char temp[1005];
char s1[1005][1005];   //下标从1到cnt
char s2[1005][1005];
int cnt1,cnt2;
int dp[1005][1005];
int main()
{
	gets(temp);
	int cnt=0;
	for(int i=0;i<strlen(temp);++i)
	{
		if(temp[i]>='A'&&temp[i]<='Z')
		{
			cnt=0;
			s1[++cnt1][cnt++]=temp[i];
		}
		else
		{
			s1[cnt1][cnt++]=temp[i];
		}
	}
	gets(temp);
	cnt=0;
	for(int i=0;i<strlen(temp);++i)
	{
		if(temp[i]>='A'&&temp[i]<='Z')
		{
			cnt=0;
			s2[++cnt2][cnt++]=temp[i];
		}
		else
		{
			s2[cnt2][cnt++]=temp[i];
		}
	}
	for(int i=1;i<=cnt1;++i)
	{
		for(int j=1;j<=cnt2;++j)
		{
			if(strcmp(s1[i],s2[j])==0)dp[i][j]=dp[i-1][j-1]+1;
			else dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
		}
	}
	printf("%d",dp[cnt1][cnt2]);
	return 0;
}

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String text1 = in.nextLine();
        String text2 = in.nextLine();
        int n = text1.length();
        int m = text2.length();

        String[] s1 = new String[1000];
        int index1 = 0;
        int cnt1 = 0;
        for(int i=1;i<n;i++){
            char c = text1.charAt(i);
            if(c>='A'&&c<='Z'){
                s1[cnt1]=text1.substring(index1,i);
                index1=i;
                cnt1++;
            }
        }
        s1[cnt1++]=text1.substring(index1,n);

        String[] s2 = new String[1000];
        int index2 = 0;
        int cnt2 = 0;
        for(int i=1;i<m;i++){
            char c = text2.charAt(i);
            if(c>='A'&&c<='Z'){
                s2[cnt2]=text2.substring(index2,i);
                index2=i;
                cnt2++;
            }
        }
        s2[cnt2++]=text2.substring(index2,m);

        int[][] dp = new int[cnt1+1][cnt2+1];
        for(int i=1;i<cnt1+1;i++){
            for(int j=1;j<cnt2+1;j++){
                if(s1[i-1].equals(s2[j-1])){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        System.out.println(dp[cnt1][cnt2]);
    }
}

Python

def f(s,t):  
    S = [0]            #存放s划分后的蓝肽  
    S_Up = []          #记录s中大写字母的下标  
    T = [0]            #存放s划分后的蓝肽  
    T_Up = []          #记录t中大写字母的下标  
    for i in range(len(s)):  
        if 'A' <= s[i] <= 'Z':  
            S_Up.append(i)  
    S_Up.append(len(s))   #此处要在最后再添加一个s的长度,以便后面划分字符串  
       
    for i in range(len(t)):  
        if 'A' <= t[i] <= 'Z':  
            T_Up.append(i)  
    T_Up.append(len(t))   #此处要在最后再添加一个t的长度,以便后面划分字符串  
   
    for i in range(len(S_Up)-1):  #对s划分蓝肽  
        l = S_Up[i]  
        r = S_Up[i+1]  
        S.append(s[l:r])  
   
    for i in range(len(T_Up)-1):  #对t划分蓝肽  
        l = T_Up[i]  
        r = T_Up[i+1]  
        T.append(t[l:r])  
   
    n = len(S)  
    m = len(T)  
    dp = [[0 for j in range(m)] for i in range(n)]    #查找最长子序列  
    for i in range(1,n):  
        for j in range(1,m):  
            if S[i] == T[j]:  
                dp[i][j] = dp[i-1][j-1]+1  
            else:  
                dp[i][j] = max(dp[i][j-1],dp[i-1][j])  
   
    print(dp[n-1][m-1])  
       
   
if __name__ == '__main__':  
    s = input().strip()  
    t = input().strip()  
    f(s,t)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。