Input: grid =[[1,2,3],[4,3,2],[1,1,1]]Output: 8Explanation:

We can select the cells with values 1,3, and 4 that are colored above.
Input: grid =[[8,7,6],[8,3,2]]Output: 15Explanation:

We can select the cells with values 7 and 8 that are colored above.
We need to select at most one cell per row, and all selected values must be unique. Since grid values are small (≤100) and grid size is small (≤10x10), we can enumerate all subsets of unique values and try to assign them to rows using DP or backtracking.
#include<vector>#include<unordered_map>#include<algorithm>usingnamespace std;
classSolution {
public:int maxScore(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<int> vals;
unordered_map<int, vector<int>> valRows;
for (int i =0; i < m; ++i)
for (int j =0; j < n; ++j) {
int v = grid[i][j];
if (valRows.count(v) ==0) vals.push_back(v);
valRows[v].push_back(i);
}
int U = vals.size(), res =0;
for (int mask =1; mask < (1<<U); ++mask) {
vector<int> used(m, 0);
int sum =0, ok =1;
for (int i =0; i < U; ++i) if (mask & (1<<i)) {
int found =0;
for (int r : valRows[vals[i]]) if (!used[r]) {
used[r] =1; sum += vals[i]; found =1; break;
}
if (!found) { ok =0; break; }
}
if (ok) res = max(res, sum);
}
return res;
}
};
import java.util.*;
classSolution {
publicintmaxScore(int[][] grid) {
int m = grid.length, n = grid[0].length;
Map<Integer, List<Integer>> valRows =new HashMap<>();
List<Integer> vals =new ArrayList<>();
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j) {
int v = grid[i][j];
if (!valRows.containsKey(v)) vals.add(v);
valRows.computeIfAbsent(v, k ->new ArrayList<>()).add(i);
}
int U = vals.size(), res = 0;
for (int mask = 1; mask < (1<<U); ++mask) {
boolean[] used =newboolean[m];
int sum = 0; boolean ok =true;
for (int i = 0; i < U; ++i) if ((mask & (1<<i)) > 0) {
boolean found =false;
for (int r : valRows.get(vals.get(i))) if (!used[r]) {
used[r]=true; sum += vals.get(i); found =true; break;
}
if (!found) { ok =false; break; }
}
if (ok) res = Math.max(res, sum);
}
return res;
}
}
classSolution {
funmaxScore(grid: Array<IntArray>): Int {
val m = grid.size
val n = grid[0].size
val valRows = mutableMapOf<Int, MutableList<Int>>()
val vals = mutableListOf<Int>()
for (i in0 until m) for (j in0 until n) {
val v = grid[i][j]
if (v !in valRows) vals.add(v)
valRows.getOrPut(v) { mutableListOf() }.add(i)
}
val U = vals.size
var res = 0for (mask in1 until (1 shl U)) {
val used = BooleanArray(m)
var sum = 0var ok = truefor (i in0 until U) if ((mask and (1 shl i)) !=0) {
var found = falsefor (r in valRows[vals[i]]!!) if (!used[r]) {
used[r] = true; sum += vals[i]; found = true; break }
if (!found) { ok = false; break }
}
if (ok) res = maxOf(res, sum)
}
return res
}
}
defmaxScore(grid):
m, n = len(grid), len(grid[0])
from collections import defaultdict
val_rows = defaultdict(list)
vals = []
for i in range(m):
for j in range(n):
v = grid[i][j]
if v notin val_rows:
vals.append(v)
val_rows[v].append(i)
U, res = len(vals), 0for mask in range(1, 1<<U):
used = [0]*m
sumv, ok =0, Truefor i in range(U):
if mask & (1<<i):
found =Falsefor r in val_rows[vals[i]]:
ifnot used[r]:
used[r] =1; sumv += vals[i]; found =True; breakifnot found:
ok =False; breakif ok:
res = max(res, sumv)
return res
use std::collections::HashMap;
pubfnmax_score(grid: Vec<Vec<i32>>) -> i32 {
let m = grid.len();
let n = grid[0].len();
letmut val_rows: HashMap<i32, Vec<usize>>= HashMap::new();
letmut vals =vec![];
for i in0..m {
for j in0..n {
let v = grid[i][j];
if!val_rows.contains_key(&v) { vals.push(v); }
val_rows.entry(v).or_default().push(i);
}
}
let U = vals.len();
letmut res =0;
for mask in1..(1<<U) {
letmut used =vec![false; m];
letmut sum =0;
letmut ok =true;
for i in0..U {
if (mask & (1<<i)) >0 {
letmut found =false;
for&r in&val_rows[&vals[i]] {
if!used[r] { used[r] =true; sum += vals[i]; found =true; break; }
}
if!found { ok =false; break; }
}
}
if ok && sum > res { res = sum; }
}
res
}