题目链接:hihocoder 1241

题意:

n*n的格阵,每个方格内有一个数字.蚂蚁从左上角走到右下角,数字是零的方格不能走,只能向右向下走.蚂蚁走的路径上全部方格的的乘积为s,要使s低位0的个数尽量少.问,最少s的末尾包含几个0.

分析:

10=2*5,所以只要统计蚂蚁路径上2的个数和5的个数,二者之中的较小者即为s末尾0的个数.

假设2的个数为x,5的个数为y.

对于路径(x,y),答案是min(x,y).

"路径(p,q)比路径(x,y)好"的充要条件"min(p,q)<min(x,y)".

最优路径(x,y)中x为最小值或者y为最小值.

这个问题可以进行延伸:将路径上数字的乘积用k进制来表示,使得末尾0的个数尽量少.对k进行因子分解,当k是若干个质数的乘积时,k=p1*p2*p3*p4...,对于每一个pi进行一次动归.当上边的主键等于左边时,就应该比较剩余的值,有点不好整了,还是两个质数之积比较简单.当k=p1^m1*p2^m2......时,又该怎么做呢?

代码:

 #include<iostream>
 #include<stdio.h>
 #include<algorithm>
 #include<queue>
 #include<math.h>
 #include<string.h>
 #include<stdlib.h>
 using namespace std;
 typedef long long ll;
 typedef unsigned long long ull;
 #define re(i,n) ;i<n;i++)
 int n;
 ;
 int a[maxn][maxn];
 int two[maxn][maxn], five[maxn][maxn];
 int s[maxn][maxn][];
 void go(int c[maxn][maxn], int x){
     for (int i = 1; i <= n; i++){
         for (int j = 1; j <= n; j++){
             if (a[i][j] == 0){
                 c[i][j] = 1e6; continue;
             }
             int cnt = ;
             ; k /= x)cnt++;
             c[i][j] = cnt;
         }
     }
 }
 void work(int c[maxn][maxn], int cc[maxn][maxn]){
     re(i, n + 1)s[0][i][0] = s[0][i][1] = s[i][0][0] = s[i][0][1] = 1e6;
     s[0][1][0] = s[0][1][1] = s[1][0][0] = s[1][0][1] = 0;
     for (int i = 1; i <= n; i++){
         for (int j = 1; j <= n; j++){
             if (s[i - 1][j][0] == s[i][j - 1][0]){
                 s[i][j][0] = c[i][j] + s[i][j - 1][0];
                 s[i][j][1] = cc[i][j]+min(s[i][j - 1][1], s[i - 1][j][1]);
             }
             ][j][]< s[i][j - ][]){
                 s[i][j][0] = s[i - 1][j][0] + c[i][j];
                 s[i][j][1] = s[i - 1][j][1] + cc[i][j];
             }
             else{
                 s[i][j][0] = s[i][j-1][0] + c[i][j];
                 s[i][j][1] = s[i][j-1][1] + cc[i][j];
             }
         }
     }
 }
 int main(){
     freopen("in.txt", "r", stdin);
     cin >> n;
     re(i, n)re(j, n)scanf("%d", &a[i + 1][j + 1]);
     go(two, 2), go(five, 5);
     work(two, five); int p = min(s[n][n][0], s[n][n][1]);
     work(five, two); int q = min(s[n][n][0], s[n][n][1]);
     cout << min(p, q) << endl;
     return 0;
 }

hihocoder1241 Best Route in a Grid的更多相关文章

  1. hihocoder 1241:Best Route in a Grid

    #1241 : Best Route in a Grid 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N行N列的非负整数方阵,从左上角(1,1)出发,只能向下 ...

  2. #1241 : Best Route in a Grid

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N行N列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能到达值为0的方格,求出一条到达右下角的最佳 ...

  3. 广大暑假训练1(poj 2488) A Knight's Journey 解题报告

    题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A   (A - Children of the Candy Corn) ht ...

  4. [4]Telerik Grid 简单使用方法

    1.columns <% Html.Telerik().Grid(Model) .Name("Orders") .Columns(columns => { //绑定列名 ...

  5. Oracle Grid control 11g及Active DataGuard 11g安装部署

    Oracle Grid control 11g及Active DataGuard 11g安装部署(一) 原贴 http://blog.csdn.net/lichangzai/article/detai ...

  6. MatterTrack Route Of Network Traffic :: Matter

    Python 1.1 基础 while语句 字符串边缘填充 列出文件夹中的指定文件类型 All Combinations For A List Of Objects Apply Operations ...

  7. ExtJS 4.2 Grid组件的单元格合并

    ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid ...

  8. WPF中Grid实现网格,表格样式通用类

    /// <summary> /// 给Grid添加边框线 /// </summary> /// <param name="grid"></ ...

  9. Application Request Route实现IIS Server Farms集群负载详解

    序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...

随机推荐

  1. addrinfo 结构

    typedef struct addrinfo {int             ai_flags;int            ai_family;int             ai_sockty ...

  2. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  3. 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)

    一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...

  4. Linux dd

    一.简介 二.实例 1)复制二进制文件指定章节 iflag=skip_bytes bs= count= of=test 2)修改二进制文件指定章节 oflag=seek_bytes bs= count ...

  5. centos之开放80端口

    #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT  #/sbin/iptables -I INPUT -p tcp --dport 22 -j ...

  6. IO的多路复用和信号驱动

    Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...

  7. MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)

    在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...

  8. Unity 脚本的未来发展

    新技术之IL2CPP 最近,我们谈到了Unity 的WebGL . 在那篇文中我们简要谈论到脚本在 WebGL  中的运行的新技术称为"IL2CPP" .然而IL2CPP 所代表的 ...

  9. OpenSessionInview

    Open Session In View模式的主要思想是:在用户的每一次请求过程始终保持一个Session对象打开着 实现步骤: 步骤一.创建一个Web项目,创建包cn.happy.util,创建Hi ...

  10. [No000012]编程中浮点数之什么是科学计数法

    科学记数法 把一个绝对值小于1(或者大于等于10)的实数记为a×10n的形式(其中1≤/a/<10),这种记数法叫做科学记数法. (或者大于等于10)的实数记为a×10^n的形式(其中1≤|a| ...