携程笔试2-动态规划(未解决)

Posted wsZzz1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了携程笔试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;
}

 

以上是关于携程笔试2-动态规划(未解决)的主要内容,如果未能解决你的问题,请参考以下文章

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

携程2016研发工程师笔试

携程开发笔试记录

动态规划(数据结构笔试复测Leecode牛客)

动态规划字节跳动算法笔试遭遇雨水坑问题