class Solution {
public:
vector<vector<int>>f;
vector<int>nums;intmaxCoins(vector<int>& _nums){int n = _nums.size();
f = vector<vector<int>>(n +2,vector(n +2,-1));
nums = vector<int>(n +2);
nums[0]= nums[n +1]=1;for(int i =0; i < n; i ++) nums[i +1]= _nums[i];returndp(0, n +1);}intdp(int x,int y){if(f[x][y]!=-1)return f[x][y];
f[x][y]=0;for(int i = x +1; i < y; i ++)
f[x][y]=max(f[x][y],dp(x, i)+dp(i, y)+ nums[x]* nums[i]* nums[y]);return f[x][y];}};
class Solution {
public:intnthSuperUglyNumber(int n, vector<int>& primes){
vector<int>dp(n +1, INT_MAX);
dp[0]=1;
vector<int>index(primes.size(),0);for(int i =1; i <= n; i ++){for(int j =0; j < index.size(); j ++)
dp[i]=min(dp[i], primes[j]* dp[index[j]]);for(int j =0; j < index.size(); j ++)if(dp[i]== primes[j]* dp[index[j]])
index[j]++;}return dp[n -1];}};
class Solution {
public:
string removeDuplicateLetters(string s){
string res ="";int n = s.size();
unordered_map<char,int>hash;
vector<int>vis(26, false);for(int i =0; i < n; i ++)
hash[s[i]]= i;for(int i =0; i < n; i ++){if(vis[s[i]-'a'])continue;while(res.size()>0&& s[i]< res.back()&& i < hash[res.back()]){
vis[res.back()-'a']= false;
res.pop_back();}
res += s[i];
vis[s[i]-'a']= true;}return res;}};
class Solution {
public:intmaxProduct(vector<string>& words){int n = words.size(), res =0;
vector<int>val(n,0);for(int i =0; i < n; i ++)for(auto&c : words[i])
val[i]|=1<<(c -'a');for(int i =0; i < n; i ++)for(int j = i +1; j < n; j ++){int v =(val[i]& val[j])?0: words[i].size()* words[j].size();
res =max(res, v);}return res;}};
class Solution {
public:intbulbSwitch(int n){returnsqrt(n);}};