comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
中等 |
|
给你两个整数 n
和 k
,和两个二维整数数组 stayScore
和 travelScore
。
一位旅客正在一个有 n
座城市的国家旅游,每座城市都 直接 与其他所有城市相连。这位游客会旅游 恰好 k
天(下标从 0 开始),且旅客可以选择 任意 城市作为起点。
每一天,这位旅客都有两个选择:
- 留在当前城市:如果旅客在第
i
天停留在前一天所在的城市curr
,旅客会获得stayScore[i][curr]
点数。 - 前往另外一座城市:如果旅客从城市
curr
前往城市dest
,旅客会获得travelScore[curr][dest]
点数。
请你返回这位旅客可以获得的 最多 点数。
示例 1:
输入:n = 2, k = 1, stayScore = [[2,3]], travelScore = [[0,2],[1,0]]
输出:3
解释:
旅客从城市 1 出发并停留在城市 1 可以得到最多点数。
示例 2:
输入:n = 3, k = 2, stayScore = [[3,4,2],[2,1,2]], travelScore = [[0,2,1],[2,0,4],[3,2,0]]
输出:8
解释:
旅客从城市 1 出发,第 0 天停留在城市 1 ,第 1 天前往城市 2 ,可以得到最多点数。
提示:
1 <= n <= 200
1 <= k <= 200
n == travelScore.length == travelScore[i].length == stayScore[i].length
k == stayScore.length
1 <= stayScore[i][j] <= 100
0 <= travelScore[i][j] <= 100
travelScore[i][i] == 0
class Solution:
def maxScore(
self, n: int, k: int, stayScore: List[List[int]], travelScore: List[List[int]]
) -> int:
f = [[-inf] * n for _ in range(k + 1)]
f[0] = [0] * n
for i in range(1, k + 1):
for j in range(n):
for h in range(n):
f[i][j] = max(
f[i][j],
f[i - 1][h]
+ (stayScore[i - 1][j] if j == h else travelScore[h][j]),
)
return max(f[k])
class Solution {
public int maxScore(int n, int k, int[][] stayScore, int[][] travelScore) {
int[][] f = new int[k + 1][n];
for (var g : f) {
Arrays.fill(g, Integer.MIN_VALUE);
}
Arrays.fill(f[0], 0);
for (int i = 1; i <= k; ++i) {
for (int j = 0; j < n; ++j) {
for (int h = 0; h < n; ++h) {
f[i][j] = Math.max(
f[i][j], f[i - 1][h] + (j == h ? stayScore[i - 1][j] : travelScore[h][j]));
}
}
}
return Arrays.stream(f[k]).max().getAsInt();
}
}
class Solution {
public:
int maxScore(int n, int k, vector<vector<int>>& stayScore, vector<vector<int>>& travelScore) {
int f[k + 1][n];
memset(f, 0xc0, sizeof(f));
memset(f[0], 0, sizeof(f[0]));
for (int i = 1; i <= k; ++i) {
for (int j = 0; j < n; ++j) {
for (int h = 0; h < n; ++h) {
f[i][j] = max(f[i][j], f[i - 1][h] + (j == h ? stayScore[i - 1][j] : travelScore[h][j]));
}
}
}
return *max_element(f[k], f[k] + n);
}
};
func maxScore(n int, k int, stayScore [][]int, travelScore [][]int) (ans int) {
f := make([][]int, k+1)
for i := range f {
f[i] = make([]int, n)
for j := range f[i] {
f[i][j] = math.MinInt32
}
}
for j := 0; j < n; j++ {
f[0][j] = 0
}
for i := 1; i <= k; i++ {
for j := 0; j < n; j++ {
f[i][j] = f[i-1][j] + stayScore[i-1][j]
for h := 0; h < n; h++ {
if h != j {
f[i][j] = max(f[i][j], f[i-1][h]+travelScore[h][j])
}
}
}
}
for j := 0; j < n; j++ {
ans = max(ans, f[k][j])
}
return
}
function maxScore(n: number, k: number, stayScore: number[][], travelScore: number[][]): number {
const f: number[][] = Array.from({ length: k + 1 }, () => Array(n).fill(-Infinity));
f[0].fill(0);
for (let i = 1; i <= k; ++i) {
for (let j = 0; j < n; ++j) {
for (let h = 0; h < n; ++h) {
f[i][j] = Math.max(
f[i][j],
f[i - 1][h] + (j == h ? stayScore[i - 1][j] : travelScore[h][j]),
);
}
}
}
return Math.max(...f[k]);
}