hihocoder#1241 : Best Route in a Grid(DP)

来源:互联网 发布:截图软件哪个好 编辑:程序博客网 时间:2024/06/04 20:12

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个N行N列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能到达值为0的方格,求出一条到达右下角的最佳路径。所谓最佳路径是指途经的数的乘积的末尾连续的0最少。

输入

输入文件的第一行包含一个整数N,其中1≤N≤1000。

接下来的N行每行包含N个非负整数,其中每个数小于等于1,000,000。

数据保证至少存在一条不全为0的路径。

输出

输出文件仅一行,包含一个整数,表示要求的最佳路径上所有数字乘积的末尾连续零的个数。

样例输入
41 3 0 00 8 2 256 5 0 30 15 7 4
样例输出
2
思路:因为末尾0的个数来源2*5,所以我们只要找出一条2最少的路径或5最少的路径就可以了,d[i][j]表示在(i,j)2的个数或5的个数。

#include<bits/stdc++.h>using namespace std;const int MAX=1e3+10;int d[MAX][MAX];int a[MAX][MAX];int cla2(int x){    int num=0;    while(x%2==0)num++,x/=2;    return num;}int cla5(int x){    int num=0;    while(x%5==0)num++,x/=5;    return num;}int main(){    int n;cin>>n;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);    }    memset(d,0x3f,sizeof d);    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            if(i==1&&j==1){d[i][j]=cla2(a[i][j]);continue;}            if(a[i][j]==0)continue;            d[i][j]=min(d[i-1][j],d[i][j-1])+cla2(a[i][j]);        }    }    int ans=d[n][n];    memset(d,0x3f,sizeof d);    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            if(i==1&&j==1){d[i][j]=cla5(a[i][j]);continue;}            if(a[i][j]==0)continue;            d[i][j]=min(d[i-1][j],d[i][j-1])+cla5(a[i][j]);        }    }    cout<<min(ans,d[n][n])<<endl;    return 0;}



原创粉丝点击