滴滴笔试0907

对比之美

小美正在摆放她的收藏品。小美有一个漂亮的收藏架,有着一排n个格子,从左到右内存限制:分别编号为1 2…n。小美打算把她的m个收藏品放进这n个格子之中,并且尽可能摆放地好看。怎样才算好看呢?小美认为有对比才有美感,相邻两个格子收藏品数量之差越大就越美。形式化地讲,我们认为如果第i个格子里摆放了a,个收藏品,那么美观度为∑”|ai- a(i-1)|,小美觉得有些格子不放收藏品也可以接受,即要求a¡≥0,求和ai=m,请帮小美想出最美观的摆放方案 注意,||表示x的绝对值,|-5|=5,|3|=3。

一共三种情况,当n==1时只能是0,当m是2时候只能是2,除此之外只能是2m

public class Main1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < T; i++) {
            int n=sc.nextInt();
            int m=sc.nextInt();
            if(n==1){
                System.out.println(0);
            }else if(n==2){
                System.out.println(2);
            }else {
                System.out.println(2*m);
            }
        }
   }      
}

字符消除

小明有一个长度为n,由前k个小写英文字母组成的字符串(保证n为偶数)

小亮想在小明睡觉的时候把这个字符串用小明的零花钱消除干净。小亮每次可以选择该串的两个相邻的字符删除,删除后将串拼上,并花掉小明一定数量的零花钱。若某一次删除的相邻两个字符从左到右分别是a和b,则将花掉小明cost(a,b)块钱。小亮希望他花掉的零花钱尽可能多,帮帮小亮

输入描述:第一行有两个整数n,k(1<=n<=500,1<=k<=26),分别代表小明的字符串长度与字符串中的字符种类数(保证n为偶数且串的内容仅由前k个小写英文字母组成)。接下来k行给出了一个k*k的由整数构成的矩阵。矩阵中第i行第j列的元素代表消除相邻的第i个字母和第j个字母所能花掉的钱数。

最后一行有一个长度为n的字符串,代表小明的字符串。

代码看着敲得牛友单纯用来学习@冰雪灬独舞

public class Main2 {
    static Map<String,Integer> map=new HashMap<>();//定义了一个静态的HashMap来存储已经计算过的结果,以避免重复计算。
    static  int[][] ans;//静态的二维数组ans来存储成本矩阵
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 输入 n 和 k
        int n = sc.nextInt();
        int k = sc.nextInt();
        if(n<2) {
            System.out.println(0);
            return;
        }

        // 输入 k*k 的成本矩阵
        int[][] cost = new int[k][k];
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < k; j++) {
                cost[i][j] = sc.nextInt();
            }
        }
        // 输入字符串
        String s = sc.next();
        ans=cost;
        char[] charArray = s.toCharArray();
        int res=getMaxCost(charArray,0,n-1);
        System.out.println(res);

    }

    private static int getMaxCost(char[] charArray, int start, int end) {
        StringBuilder stringBuilder = new StringBuilder();
        String key = stringBuilder.append(start).append("-").append(end).toString();
        //如果该键已经存在于HashMap中,说明之前已经计算过该子串的最大成本
        if (map.containsKey(key)) {
            return map.get(key);
        }
        //如果子串的起始位置大于等于结束位置,说明当前子串为空,所以返回0
        if (start >= end) {
            return 0;
        }
        //我们判断如果起始位置和结束位置相差为1,说明当前子串只有两个字符,所以直接调用getCost函数返回该字符对应的成本。
        if (end - start == 1) {
            return getCost(charArray[start],charArray[end]);
        }
        //递归调用getMaxCost函数分别计算左子串和右子串的最大成本,并将这两部分的成本累加起来,再加上将起始位置字符和分割点字符进行配对时的成本。
        int res = 0;
        for (int i = start+1; i <=end; i+=2) {
            res = Math.max(res, getCost(charArray[start], charArray[i]) + getMaxCost(charArray,start+1,i-1) + getMaxCost(charArray,i+1,end));
        }
        //将计算得到的最大成本存入HashMap中,并返回该最大成本。
        map.put(key,res);
        return res;
    }

    private static int getCost(int start, int end){
        int a=start-'a';
        int b=end-'a';
        return ans[a][b];
    }
}
#滴滴##软件开发薪资爆料#
秋招笔面记录 文章被收录于专栏

秋招中的笔试以及面记录

全部评论
你第二题这样不超时?我差不多做法,超时了
点赞 回复 分享
发布于 09-08 17:06 四川

相关推荐

点赞 评论 收藏
分享
1 11 评论
分享
牛客网
牛客企业服务