2245. 转角路径的乘积中最多能有几个尾随零(dp)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2245. 转角路径的乘积中最多能有几个尾随零(dp)相关的知识,希望对你有一定的参考价值。
2245. 转角路径的乘积中最多能有几个尾随零(dp)
考虑贪心,要求0的个数尽可能地多,显然起点和终点都是在边界。
显然0的个数就是因子个数: min c n t 2 , c n t 5 \\min\\cnt_2,cnt_5\\ mincnt2,cnt5
考虑枚举每个拐点,就要4种情况:左上、右上、左下、右下。
时间复杂度: O ( n m ) O(nm) O(nm)
class Solution
public:
int maxTrailingZeros(vector<vector<int>>& g)
int n = g.size(),m =g[0].size();
vector<vector< vector<int> > >f(4,vector<vector<int> >(n+1,vector<int>(m+1)));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
int x = g[i-1][j-1];
int c2=0,c5=0;
while(x%5==0) x/=5,c5++;
while(x%2==0) x/=2,c2++;
f[0][i][j] = f[0][i][j-1] + c2;
// if(i==1) printf("%d---\\n",c2);
f[1][i][j] = f[1][i-1][j] + c2;
f[2][i][j] = f[2][i][j-1] + c5;
f[3][i][j] = f[3][i-1][j] + c5;
// printf("m=%d %d %d\\n",m,f[0][1][m],f[0][1][0]);
int ans = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
int tmp = 1e9;
for(int k=0;k<3;k+=2)
tmp = min(tmp,f[k][i][j]+f[k+1][i-1][j]);
ans=max(ans,tmp);
tmp = 1e9;
for(int k=0;k<3;k+=2)
tmp = min(tmp,f[k][i][j]+f[k+1][n][j]-f[k+1][i][j]);
ans=max(ans,tmp);
tmp = 1e9;
for(int k=0;k<3;k+=2)
tmp = min(tmp,f[k][i][m]-f[k][i][j]+f[k+1][i][j]);
ans=max(ans,tmp);
tmp = 1e9;
for(int k=0;k<3;k+=2)
tmp = min(tmp,f[k][i][m]-f[k][i][j]+f[k+1][n][j]-f[k+1][i-1][j]);
ans=max(ans,tmp);
return ans;
;
以上是关于2245. 转角路径的乘积中最多能有几个尾随零(dp)的主要内容,如果未能解决你的问题,请参考以下文章