为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。
今年的最大目标就是能为【一亿技术人】创造更高的价值。
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
# 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;
}
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]);
}
}
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)