地址 https://leetcode-cn.com/problems/maximum-score-words-formed-by-letters/

题目描述
你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score。

请你帮忙计算玩家在单词拼写游戏中所能获得的「最高得分」:能够由 letters 里的字母拼写出的 任意 属于 words 单词子集中,分数最高的单词集合的得分。

单词拼写游戏的规则概述如下:

玩家需要用字母表 letters 里的字母来拼写单词表 words 中的单词。
可以只使用字母表 letters 中的部分字母,但是每个字母最多被使用一次。
单词表 words 中每个单词只能计分(使用)一次。
根据字母得分情况表score,字母 ‘a’, ‘b’, ‘c’, … , ‘z’ 对应的得分分别为 score[0], score[1], …, score[25]。
本场游戏的「得分」是指:玩家所拼写出的单词集合里包含的所有字母的得分之和。

样例

示例 :

输入:words = ["dog","cat","dad","good"], letters = ["a","a","c","d","d","d","g","o","o"],
score = [,,,,,,,,,,,,,,,,,,,,,,,,,]
输出:
解释:
字母得分为 a=, c=, d=, g=, o=
使用给定的字母表 letters,我们可以拼写单词 "dad" (++)和 "good" (+++),得分为 。
而单词 "dad" 和 "dog" 只能得到 分。
示例 : 输入:words = ["xxxz","ax","bx","cx"], letters = ["z","a","b","c","x","x","x"],
score = [,,,,,,,,,,,,,,,,,,,,,,,,,]
输出:
解释:
字母得分为 a=, b=, c=, x=, z=
使用给定的字母表 letters,我们可以组成单词 "ax" (+), "bx" (+) 和 "cx" (+) ,总得分为 。
单词 "xxxz" 的得分仅为 。
示例 : 输入:words = ["leetcode"], letters = ["l","e","t","c","o","d"],
score = [,,,,,,,,,,,,,,,,,,,,,,,,,]
输出:
解释:
字母 "e" 在字母表 letters 中只出现了一次,所以无法组成单词表 words 中的单词。
  提示: <= words.length <=
<= words[i].length <=
<= letters.length <=
letters[i].length ==
score.length == 
<= score[i] <=
words[i] 和 letters[i] 只包含小写的英文字母。

算法1
(暴力枚举)
DFS 暴力枚举 是的 就是暴力
也许出题人是想做动态规划?? 然后降低了数据量么?

 class Solution {
public: int ret = ;
void transferToArr(const vector<string>& words, vector<vector<int>>& wordsArr,
const vector<char>& letters, vector<int>& lettersArr)
{
for (int i = ; i < words.size(); i++) {
vector<int> tmp();
for (int j = ; j < words[i].size(); j++) {
int idx = words[i][j] - 'a';
tmp[idx]++;
}
wordsArr.push_back(tmp);
} for (int i = ; i < letters.size(); i++) {
int idx = letters[i] - 'a';
lettersArr[idx]++;
}
} int SelectWord(vector<int> wordCount, vector<int>& lettersArr, vector<int>& score)
{
int retScore = ;
for (int i = ; i < wordCount.size(); i++) {
if (wordCount[i] != ) {
if (wordCount[i] > lettersArr[i])
return ;
lettersArr[i] -= wordCount[i];
retScore += score[i] * wordCount[i];
}
} return retScore;
} void DFS(vector<vector<int>>& wordsArr, int idx, vector<int> lettersArr, int currScore, vector<int>& score)
{
if (idx >= wordsArr.size()) {
ret = max(ret, currScore);
return;
} vector<int> copyLettersArr = lettersArr;
int addscore = SelectWord(wordsArr[idx], lettersArr, score);
if (addscore != )
DFS(wordsArr, idx+, lettersArr, currScore + addscore, score);
//这里尝试的是不放入该单词的组合
DFS(wordsArr, idx + , copyLettersArr, currScore, score);
} int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) { vector<vector<int>> wordsArr;
vector<int> lettersArr();
//将提出给出的变量 转化成字符索引 多少个字符为值得数组
transferToArr(words, wordsArr, letters, lettersArr);
DFS(wordsArr, , lettersArr, , score);
return ret;
} };

最新文章

  1. CephRGW 在多个RGW负载均衡场景下,RGW 大文件并发分片上传功能验证
  2. C++对象模型详解
  3. LightOJ1025 The Specials Menu(区间DP)
  4. (26)odoo中的序列运用
  5. flask开发框架
  6. arduino扩展IO与M74HC595B芯片的使用,挪车电话提示牌的设计
  7. 第五章 MySQL函数
  8. angular笔记_8(事件)
  9. switch语句判断学生成绩
  10. ASP.NET MVC:WebPageRenderingBase.cs
  11. SVM 推到期间 遇到的 表背景知识 (间隔最大化)
  12. Scala_Trait特征
  13. 完整的POM文档内容
  14. 黄聪:WordPress 多站点建站教程(一):怎样开启WordPress多站点功能,实现手机移动端主题开发,与主站用户数据共享
  15. mac os、linux及unix之间的关系
  16. 10分钟让你的站点也支持Markdown
  17. WPF 自定义绕圈进度条(转)
  18. css实现下拉菜单功能(多中实现方式即原理)
  19. iOS 展示 gif
  20. Linux内存使用消耗高

热门文章

  1. IDEA中使用Maven模板创建Servelet项目并使用Tomcat来运行项目
  2. Java中&quot;或&quot;运算与&quot;与&quot;运算快慢的三三两两
  3. ABAP分享五 ALV修改单元格并将修改数据更新到数据表中示例1
  4. 更改Android studio中SDK,AVD的默认路径
  5. JSP的介绍
  6. sql server一些快捷方式和操作技巧
  7. Pro Micro
  8. 小程序-picker组件选择数量
  9. [译]Vulkan教程(09)窗口表面
  10. LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees