

- Trending Categories
Data Structure
Networking
RDBMS
Operating System
Java
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Maximum Score Words Formed by Letters in C++
Suppose we have a list of words, a list of single letters and score for every character. We have to find the maximum score of any valid set of words formed by using the given letters.
We may not use all characters in letters and each letter can only be used once. Score of letters 'a', 'b', 'c', ... ,'z' is given by score[0], score[1], ... , score[25] respectively.
So, if the input is like words = ["god", "good", "toc", "cat"], letters = [a,g,o,o,d,d,d,c,t,t] and score = [5,0,8,3,0,0,6,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0], then the output will be 30, here good and cat are making maximum score.
To solve this, we will follow these steps −
Define one 2D array dp
Define a function calc(), this will take s, one map m, an array sc,
ans := 0
for initialize i := 0, when i < size of s, update (increase i by 1), do −
x := s[i]
if m[x] <= 0, then −
return 0
(decrease m[x] by 1)
ans := ans + sc[x - 'a']
return ans
Define a function solve(), this will take i, status, an array of pairs v, one map m, an array s,
if i is same as -1, then −
return 0
x := .second value of v[i]
ans := 0
if status is same as 1, then −
ans := calc(x, m, s)
if ans > 0 and status is same as 1, then −
for initialize j := 0, when j < size of x, update (increase j by 1), do −
(decrease m[x[j]] by 1)
return ans + maximum of solve(i - 1, 0, v, m, s) and solve(i - 1, 1, v, m, s)
From the main method, do the following −
ans := 0
Define one map m
for initialize i := 0, when i < size of l, update (increase i by 1), do −
(increase m[l[i]] by 1)
Define an array v of pairs
for initialize i := 0, when i < size of w, update (increase i by 1), do −
x := w[i]
flag := calc(x, m, s)
if flag is non-zero, then −
insert { flag, x } at the end of v
sort the array v
dp := Define one 2D array of size (size of v) x 2 and fill this with -1
return maximum of solve(size of v, 0, v, m, s) and solve(size of v, 1, v, m, s)
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h> using namespace std; class Solution { public: vector<vector<int> > dp; int calc(string s, map<char, int> m, vector<int>& sc){ int ans = 0; for (int i = 0; i < s.size(); i++) { char x = s[i]; if (m[x] <= 0) return 0; m[x]--; ans += sc[x - 'a']; } return ans; } int solve(int i, int status, vector<pair<int, string> > v, map<char, int> m, vector<int>& s){ if (i == -1) return 0; string x = v[i].second; int ans = 0; if (status == 1) ans = calc(x, m, s); if (ans > 0 && status == 1) { for (int j = 0; j < x.size(); j++) { m[x[j]]--; } } return ans + max(solve(i - 1, 0, v, m, s), solve(i - 1, 1, v, m, s)); } int maxScoreWords(vector<string>& w, vector<char>& l, vector<int>& s){ int ans = 0; map<char, int> m; for (int i = 0; i < l.size(); i++) m[l[i]]++; vector<pair<int, string> > v; for (int i = 0; i < w.size(); i++) { string x = w[i]; int flag = calc(x, m, s); if (flag) { v.push_back({ flag, x }); } } sort(v.begin(), v.end()); dp = vector<vector<int> >(v.size(), vector<int>(2, -1)); return max(solve(v.size() - 1, 0, v, m, s), solve(v.size() - 1, 1, v, m, s)); } }; main(){ Solution ob; vector<string> words = {"god", "good", "toc", "cat"}; vector<char> letters = {'a','g','o','o','d','d','d','c','t','t'}; vector<int> score = {5,0,8,3,0,0,6,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0}; cout << (ob.maxScoreWords(words, letters, score)); }
Input
{"god", "good", "toc", "cat"}, {'a','g','o','o','d','d','d','c','t','t'}, {5,0,8,3,0,0,6,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0}
Output
30
- Related Questions & Answers
- Maximum factors formed by two numbers in Python
- Program to find maximum additive score by deleting numbers in Python
- c# Put spaces between words starting with capital letters
- Maximum subarray sum in array formed by repeating the given array k times in C++
- C++ Program to find maximum score of bit removal game
- Program to find maximum score by splitting binary strings into two parts in Python
- Maximum length cycle that can be formed by joining two nodes of a binary tree in C++
- Interchanging first letters of words in a string in JavaScript
- Area of squares formed by joining midpoints repeatedly in C?
- Count pairs formed by distinct element sub-arrays in C++
- Python program to find word score from list of words
- Maximum score after flipping a Binary Matrix atmost K times in C++
- Maximum number of 3-person teams formed from two groups in C++
- Maximum possible time that can be formed from four digits in C++
- Find maximum score for duplicate Name values in MongoDB?