携程笔试2-动态规划(未解决)
作者:互联网
动态规划题:
出租车选单:
输入
1 2 3 3 开始时间
3 4 5 6 结束时间
200 150 180 210 每单的金钱
订单时间不能重合:例如,选了13 就不能选 24 ,但可以选3 5 或者 3 6
回溯思路:订单排序,按startTime,endTime
然后一次取出订单,选择接单或者不接单,(需要考虑,接单的startTime必须大于等于上一次接单的endTime)。
共有2^n种情况。
优化:可以加入的剪枝操作,当当前的startTime小于最后一次的endTime时,直接退出循环
if(quest.startTime<endTime){
maxMoney = Math.max(maxMoney,curMoney);
return;
}
用的回溯:只通过了33%
public class Xiecheng1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // int n = Integer.valueOf(scanner.nextLine()); // String[] startTime = scanner.nextLine().split(" "); // String[] endTime = scanner.nextLine().split(" "); // String[] moneys = scanner.nextLine().split(" "); int n = 4; String[] startTime = "1 2 3 3".split(" "); String[] endTime = "3 4 5 6".split(" "); String[] moneys = "200 150 180 210".split(" "); System.out.println(maxValue(n, startTime, endTime, moneys)); } public static int maxMoney=0; private static int maxValue(int n, String[] startTime, String[] endTime, String[] moneys) { PriorityQueue<Quest> list= new PriorityQueue<>(new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { Quest q1 = (Quest) o1; Quest q2 = (Quest) o2; if(q1.startTime!=q2.startTime){ return q1.startTime - q2.startTime; }else{ return q1.endTime-q2.endTime; } } }); for (int i = 0; i < n; i++) { int a = Integer.parseInt(startTime[i]); int b = Integer.parseInt(endTime[i]); int c = Integer.parseInt(moneys[i]); list.add(new Quest(a,b,c)); } Quest[] quests = new Quest[n]; for (int i = 0; i < n; i++) { quests[i] = list.poll(); } solution(0,n,0,0,quests); return maxMoney; } public static void solution(int c, int n, int endTime,int curMoney, Quest[] quests){ if(c == n){ maxMoney = Math.max(maxMoney,curMoney); return; } // 这次选 Quest quest = quests[c]; if(quest.startTime>=endTime){ solution(c+1,n,quest.endTime,curMoney+quest.money,quests); } // 这次不选 solution(c+1,n,endTime,curMoney,quests); } } class Quest{ public Quest(int startTime,int endTime, int money){ this.startTime = startTime; this.endTime = endTime; this.money = money; } public int startTime; public int endTime; public int money; }
标签:动态,String,携程,int,笔试,Quest,startTime,endTime,public 来源: https://www.cnblogs.com/wsZzz1997/p/14766493.html