每日一题(小白)动态规划篇8

每日一题(小白)动态规划篇8_第1张图片

理解题意很重要尤其是这种题,如果遇见这种题说了很多别的术语,别的不要管直接看最后一句。给你两个序列,找出最长的公共序列,结合前文简单一看就知道是给你两个字符串,找出大写字母开头且相同的字符串,大写字母后不限定必须紧跟之前的字母(可以跳着选取)——最长不连接子序列,那么首先我们必须处理好字符串,然后使用动态规划的方式寻找最长子序列

①接收两个字符串

②对两组字符串进行处理

③每一个大写字母开头的字符串存储到新的字符数组中

④使用动态规划寻找最长子序列(***)

⑤输出结果

代码如下

			int size=(int) (1e3+5);
			Scanner scanner=new Scanner(System.in);
			String s1=scanner.nextLine();
			String s2=scanner.nextLine();
			char[] char1 = s1.toCharArray();
			char[] char2 = s2.toCharArray();
			String[] s3=new String[size];
			String[] s4=new String[size];
			int count1=0;
			for (int i = 0; i < char1.length; i++) {
				
				if (char1[i]>='A' && char1[i]<='Z') {
					count1++;
				}
				s3[count1]+=char1[i];//得到第一个字符串的蓝太子序列
			}
			int count2=0;
			for (int i = 0; i < char2.length; i++) {
				if (char2[i]>='A' && char2[i]<='Z') {
					count2++;
				}
				s4[count2]+=char2[i];//得到第二个字符串的蓝太子序列
			}
		    int[][] arr=new int[count1+1][count2+1];
			for (int i = 1; i <= count1; i++) {
				for (int j = 1; j <= count2; j++) {
					if (s3[i].equals(s4[j])) {//进行对比
						arr[i][j]=arr[i-1][j-1]+1;//构成子序列在前一个基础上+1
					}else {
						arr[i][j]=Math.max(arr[i-1][j],arr[i][j-1]);//不能构成子序列选取两个中的最大值
					}
				}
			}
			System.out.println(arr[count1][count2]);
			scanner.close();

    }

第一个开始一定为0。状态①多一个则在原来的状态+1,状态②不同则取之前的最大值

每日一题(小白)动态规划篇8_第2张图片

你可能感兴趣的:(动态规划,算法,java,开发语言)