ACM超时,help

qq_43164599 2019-01-23 04:34:54
Sample Input

3 3 //两数组的长度
1 2 1 //第一个数组
2 1 1 //第二个数组
1 2 1 1 2 1 //合数组
3 3
1 2 1
2 1 2
1 1 1 2 2 2
0 0

Sample Output

possible
not possible

题目的意思: 给你两个数组a,b 让a,b两个数组按其原序(单个数组内的元素前后顺序不变,第二个数组的元素可以插入到第一个里面)进行组合,问能否组合成为c数组?

//////////代码超时了,dfs究竟有什么问题呢?

package dynamicProgramming;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class LISTest {

public static int N1, N2;
public static int[] train1 = new int[1001];
public static int[] train2 = new int[1001];
public static int[] combain = new int[2002];
public static boolean flag;
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer sTokenizer = null;
sTokenizer = new StringTokenizer(input.readLine());
//FileInputStream fileInputStream= new FileInputStream("C:\\Users\\LAC\\Desktop\\新建文件夹 (2)\\input.txt");
N1 = Integer.parseInt(sTokenizer.nextToken());
N2 = Integer.parseInt(sTokenizer.nextToken());
while(N1 != 0 && N2 != 0) {
sTokenizer = new StringTokenizer(input.readLine());
for(int i = 1; i <= N1; i++) train1[i] = Integer.parseInt(sTokenizer.nextToken());
sTokenizer = new StringTokenizer(input.readLine());
for(int j = 1; j <= N2; j++) train2[j] = Integer.parseInt(sTokenizer.nextToken());
sTokenizer = new StringTokenizer(input.readLine());
for(int k = 1; k <= N1+N2; k++) combain[k] = Integer.parseInt(sTokenizer.nextToken());
flag = false;
dfs(1, 1, 1);
if(flag) System.out.print("possible");
else System.out.print("not possible");
sTokenizer = new StringTokenizer(input.readLine());
N1 = Integer.parseInt(sTokenizer.nextToken());
N2 = Integer.parseInt(sTokenizer.nextToken());
if(N1 != 0 && N2 != 0) System.out.println();
}
}
public static void dfs(int i, int j, int n) { //i,j表示当前结点的左右子结点在train1和train2中的下标
if(n == N1 + N2+1) {
flag = true;
return;
}
if(flag == false && i <= N1 && train1[i] == combain[n]) dfs(i+1, j, n+1);
if(flag == false && j <= N2 && train2[j] == combain[n]) dfs(i, j+1, n+1);
}

}
...全文
122 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-01-24
  • 打赏
  • 举报
回复
StringTokenizer现在应该不用了把,已被string.split 替代了。


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class test12 {

public static void main(String[] args) {
// TODO Auto-generated method stub
String s1[], s2[], s3[], length[];
List<Array> list = new ArrayList<Array>();
Scanner sc = new Scanner(System.in);
do {
System.out.println("请输入2个数组的长度用空格分开:");
length = sc.nextLine().split(" ");
// 数组长度为0时 结束输入
if (Integer.parseInt(length[0]) == 0 || Integer.parseInt(length[1]) == 0) {
break;
}
do {
System.out.println("请输入第一个数组数字用空格分开:");
s1 = sc.nextLine().split(" ");
} while (s1.length != Integer.parseInt(length[0]));
do {
System.out.println("请输入第二个数组数字用空格分开:");
s2 = sc.nextLine().split(" ");
} while (s2.length != Integer.parseInt(length[1]));
System.out.println("请输入组合数组数字用空格分开:");
s3 = sc.nextLine().split(" ");
Array arr = new Array(s1, s2, s3);
list.add(arr);
} while (true);
for (Array i : list) {
if (i.s3.length != (i.s1.length + i.s2.length)) {
break;
} else {
i.combain(0, 0, 0);
}
if (i.isFlag()) {
System.out.println("Possible");
} else {
System.out.println("Not possible");
}
}

}

}

// 建立一个3个字符串数组加一个布尔判断符的类
class Array {
String[] s1, s2, s3;
boolean flag = false;

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}

public String[] getS1() {
return s1;
}

public void setS1(String[] s1) {
this.s1 = s1;
}

public String[] getS2() {
return s2;
}

public void setS2(String[] s2) {
this.s2 = s2;
}

public String[] getS3() {
return s3;
}

public void setS3(String[] s3) {
this.s3 = s3;
}

public Array(String[] s1, String[] s2, String[] s3) {
super();
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
}

// s1和s2 能否合并为s3 的判断方法
public void combain(int a, int b, int c) {
if (a < s1.length) {
if (s3[c].equals(s1[a]) && c <= s3.length) {
if (s1.length == a + 1 && s2.length == b && s3.length == c + 1) {
setFlag(true);
} else {
combain(a + 1, b, c + 1);
}
}
}
if (b < s2.length) {
if (s3[c].equals(s1[b]) && c < s3.length) {
if (s1.length == a && s2.length == b + 1 && s3.length == c + 1) {
setFlag(true);
} else {
combain(a, b + 1, c + 1);
}
}
}
}
}

qq_43164599 2019-01-23
  • 打赏
  • 举报
回复
hdu3779
qq_43164599 2019-01-23
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧