给定数组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
上来题读错了,看成四个方向了,其实是右和下的递推。
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 };
浙公网安备 33010602011771号