#1241 : Best Route in a Grid
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个N行N列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能到达值为0的方格,求出一条到达右下角的最佳路径。所谓最佳路径是指途经的数的乘积的末尾连续的0最少。
输入
输入文件的第一行包含一个整数N,其中1≤N≤1000。
接下来的N行每行包含N个非负整数,其中每个数小于等于1,000,000。
数据保证至少存在一条不全为0的路径。
输出
输出文件仅一行,包含一个整数,表示要求的最佳路径上所有数字乘积的末尾连续零的个数。
- 样例输入
-
4 1 3 0 0 0 8 2 25 6 5 0 3 0 15 7 4
- 样例输出
-
2
/* *********************************************** Author :guanjun Created Time :2016/3/25 19:56:57 File Name :hiho15a.cpp ************************************************ */ #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <iomanip> #include <list> #include <deque> #include <stack> #define ull unsigned long long #define ll long long #define mod 90001 #define INF 0x3f3f3f3f #define maxn 10010 #define cle(a) memset(a,0,sizeof(a)) const ull inf = 1LL << 61; const double eps=1e-5; using namespace std; priority_queue<int,vector<int>,greater<int> >pq; struct Node{ int x,y; }; struct cmp{ bool operator()(Node a,Node b){ if(a.x==b.x) return a.y> b.y; return a.x>b.x; } }; bool cmp(int a,int b){ return a>b; } int b[1010][1010],c[1010][1010],a; int dp[1010][1010]; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif //freopen("out.txt","w",stdout); int n; while(cin>>n){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&a); if(a==0){ b[i][j]=-1; c[i][j]=-1; continue; } b[i][j]=c[i][j]=0; while(a%5==0)b[i][j]++,a/=5; while(a%2==0)c[i][j]++,a/=2; } } memset(dp,INF,sizeof dp); dp[1][1]=b[1][1]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(b[i][j]==-1)continue; if(i>1)dp[i][j]=min(dp[i-1][j]+b[i][j],dp[i][j]); if(j>1)dp[i][j]=min(dp[i][j-1]+b[i][j],dp[i][j]); } } //cout<<dp[2][2]<<endl; int ans=dp[n][n]; memset(dp,INF,sizeof dp); dp[1][1]=c[1][1]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(c[i][j]==-1)continue; if(i>1)dp[i][j]=min(dp[i-1][j]+c[i][j],dp[i][j]); if(j>1)dp[i][j]=min(dp[i][j-1]+c[i][j],dp[i][j]); } } cout<<min(dp[n][n],ans)<<endl; } return 0; }
原文地址:http://www.cnblogs.com/pk28/
与有肝胆人共事,从无字句处读书。
欢迎关注公众号:
欢迎关注公众号: