力扣 第 475 场周赛(A~C)

A:3740. 三个相等元素之间的最小距离 I
见B。

B:3741. 三个相等元素之间的最小距离 II

给定数组nums,要求值相同的三元组的下标最小距离,距离定义为abs(i - j) + abs(j - k) + abs(k - i),数据范围为1e5.

我们我们可以按[值,下标]升序排序,然后遍历值相同的三个元素,来更新答案。

 1 class Solution:
 2     def minimumDistance(self, nums: List[int]) -> int:
 3         p=[]
 4         for i,x in enumerate(nums):
 5             p.append([x,i])
 6         p.sort(key=lambda x:[x[0],x[1]])
 7         ans=inf
 8         for i in range(2,len(p)):
 9             if p[i][0]==p[i-1][0] and p[i][0]==p[i-2][0]:
10                 a=p[i][1]
11                 b=p[i-1][1]
12                 c=p[i-2][1]
13                 ans=min(ans,abs(a-b)+abs(a-c)+abs(c-b))
14         return ans if ans!=inf else -1

C:3742. 网格中得分最大的路径

上来题读错了,看成四个方向了,其实是右和下的递推。

f[i][j][k]表示走到i,j但是花费不超过k的最大分数,则有f[ i ][ j ][ k ]=max(f[ i-1 ][ j ][ u ], f[ i ][ j-1 ][ u ]),其中u=k-1 if g[i][j]>0 else k.

起始条件为f[i][j][cost]=0,其余为-inf,其中cost=0 if g[0][0]==0 else 1

 1 // const int N = 210;
 2 // int f[N][N][2*N];
 3 class Solution {
 4 public:
 5     int maxPathScore(vector<vector<int>>& g, int d) {
 6         int n=g.size();
 7         int m=g[0].size();
 8         d=min(d,m+n-1);
 9         vector<vector<vector<int>>> f(n, vector<vector<int>>(m, vector<int>(d + 1, -0x3f3f3f3f)));
10         // memset(f,-0x3f,sizeof f);
11         int cost = (g[0][0]==0?0:1);
12         // if(cost>d)
13         //     return -1;
14         f[0][0][cost]=0;
15         for(int i=0;i<n;i++){
16             for(int j=0;j<m;j++){
17                 // if(i==0 && j==0) continue;
18                 for(int k=0;k<=d;k++){
19                     if(i>0){
20                         int prek=k;
21                         if(g[i][j]!=0)
22                             prek-=1;
23                         if(prek>=0)
24                             f[i][j][k]=max(f[i][j][k],f[i-1][j][prek]+g[i][j]);
25                     }
26                     if(j>0){
27                         int prek=k;
28                         if(g[i][j]!=0)
29                             prek-=1;
30                         if(prek>=0)
31                             f[i][j][k]=max(f[i][j][k],f[i][j-1][prek]+g[i][j]);
32                     }
33                 }
34             }
35         }
36         int ans=-1;
37         for(int i=0;i<=d;i++){
38             ans=max(ans,f[n-1][m-1][i]);
39         }
40         return ans;
41     }
42 };

 

posted on 2025-11-13 21:17  greenofyu  阅读(2)  评论(0)    收藏  举报