文档章节

【滴滴笔试0907-2】动态规划-字符消除

铂沿君
 铂沿君
发布于 昨天 22:00
字数 942
阅读 58
收藏 0

题目描述

小明有一个长度为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的字符串,代表小明的字符串。

注意:

矩阵中的i,j从0开始计数,第i个字母表示相对于字母a来计数,如a为第0个字母,b为第1个字母。

输出描述

输出一个值,代表小亮最多能花掉小明多少零花钱。

题解

import java.util.*;

class Main {
    static Map<string, integer> cache = new HashMap&lt;&gt;();
    static int[][] arrCost;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int k = sc.nextInt();

        // 如果n小于2,则直接输出0并退出程序
        if (n &lt; 2) {
            System.out.println(0);
            return;
        }

        // 创建一个k*k的二维数组arr
        int[][] arr = new int[k][k];

        // 填充二维数组arr
        for (int i = 0; i &lt; k; i++) {
            for (int j = 0; j &lt; k; j++) {
                arr[i][j] = sc.nextInt();
            }
        }


        arrCost = arr;

        // 读取一个字符串
        String str = sc.next();

        // 将字符串转换为字符数组
        char[] strArr = str.toCharArray();

        // 调用getMaxConst方法计算最大成本
        int ans = getMaxConst(strArr, 0, n-1);

        // 输出计算结果
        System.out.println(ans);
    }


    private static int getMaxConst(char[] strArr, int begin, int end) {

        // 创建一个StringBuilder对象用于拼接字符串
        StringBuilder sb = new StringBuilder();

        // 将begin和end拼接到StringBuilder对象中
        String key = sb.append(begin).append("-").append(end).toString();

        // 如果缓存中存在该key,则直接返回缓存中的值
        if(cache.containsKey(key)) {
            return cache.get(key);
        }
        // 如果begin大于等于end,说明子字符串为空,返回0
        if(begin&gt;=end) {
            return 0;
        }
        // 如果子字符串长度为2,则直接计算成本并返回
        if (end - begin == 1) {
            return getCost(strArr[begin], strArr[end]);
        }


        // 初始化最大成本为0
        int max = 0;
        // 遍历begin到end之间的所有可能分割点
        for (int i = begin+1; i &lt;= end; i+=2) {
            // 计算当前分割点i对应的成本并更新最大成本
            max = Math.max(max, getCost(strArr[begin], strArr[i])+getMaxConst(strArr, begin+1, i-1)+getMaxConst(strArr, i+1, end));
        }
        // 将计算结果存入缓存
        cache.put(key, max);
        // 返回最大成本
        return max;
    }


    private static int getCost(char a, char b) {
        // 将字符a转换为其在字母表中的索引位置(从0开始)
        int ai = a - 'a';
        // 将字符b转换为其在字母表中的索引位置(从0开始)
        int bi = b - 'a';
        // 返回二维数组arrCost中对应索引位置的元素值
        return arrCost[ai][bi];
    }
}
铂沿君
粉丝 1
博文 200
码字总数 105045
作品 0
成都
私信 提问
加载中
点击引领话题📣
03.线程模型

误解:redis只有一个线程 Redis 的网络IO和键值对读写是由一个线程(主线程)来完成的(Redis6.0 网络IO改为多线程模型) Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由...

navyum
今天
14
0
【滴滴笔试0907-2】动态规划-字符消除

题目描述 小明有一个长度为n,由前k个小写英文字母组成的字符串(保证n为偶数)。 小亮想在小明睡觉的时候把这个字符串用小明的零花钱消除干净。小亮每次可以选择该串的两个相邻的字符删除,删...

铂沿君
昨天
58
0
大语言模型本地部署与微调

Llama3 Ollama部署Llama3 Ollama的地址:https://github.com/ollama/ollama Ollama是一个开源框架,旨在帮助用户在其本地计算机上轻松管理和部署大型语言模型(LLM)。它不仅仅支持Llama3,还支...

算法之名
昨天
104
0
vue2知识点:组件模板定义

@[toc] 3.8模板 当模板的 html 结构比较复杂时,直接在 template 属性中定义就不现实了,效率也会很低,此时我们可以使用模板,定义模板的四种形式: 问题:什么叫在使用字符串模板、x-templ...

刘大猫26
昨天
34
0
LoongArch 内核走过的这些年

CLK 2024 第 19 届中国 Linux 内核开发者大会,龙芯中科陈华才的报告。 目录 1、LoongArch 简介 2、出世:2020~2021 3、成长:2022~2023 4、腾飞:2024~未来 LoongArch 简介 LoongArch 是...

chipo
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

{{formatHtml(o.title)}}

{{i}}-{{formatHtml(o.content)}}

{{o.author.name}}
{{o.pubDate | formatDate}}
{{o.viewCount | bigNumberTransform}}
{{o.replyCount | bigNumberTransform}}

暂无文章

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部