首页 > 代码库 > 一道OJ编程题总结
一道OJ编程题总结
用暴力递归的话,以图中的测试用例为例,先让A号选择0号活,在让2-n 号员工选择1-5号活 有res1种
让A号选择1号活,在让2-n 号员工选择0, 2-5号活 有res2种
让A号选择2号活,在让2-n 号员工选择0-1,3-5号活 有res3种
。。。
让A号选择5号活,在让2-n 号员工选择0-4号活 有res5种
res = res1 + res2 + ... + res5
因为前1名员工选择了0活,为了让0不出现在候选列表中,需要将其对应的flag置为true, 表示其已被选择。
这种思路和在数组中找到出现次数大于一半的数中,一次删去2个数 的原理相同,也是通过改变其flag,并不是真的删去该数。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.TreeSet; public class test { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int num = Integer.parseInt(in.nextLine()); List<Integer>[] list = new ArrayList[num]; for(int i = 0; i < num; i++){ list[i] = new ArrayList<>(); } for(int i = 0; i < num; i++){ String str = in.nextLine(); for(int j = 0; j < str.length(); j++) list[i].add(str.charAt(j) - ‘0‘); } boolean[] flag = new boolean[6]; process(list, 0, flag); System.out.println(res); } public static int res = 0; public static void process(List<Integer>[] array, int index, boolean[] flag){ if(index == array.length) return; List<Integer> list = array[index]; for(int i = 0; i < list.size() ; i++){ if(!flag[list.get(i)]){ flag[list.get(i)] = true; if(index == array.length - 1) res++; process(array, index+1, flag); flag[array[index].get(i)] = false; } } } }
一道OJ编程题总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。