原题传送:http://codeforces.com/problemset/problem/2/B

  动态规划。

  要求经过的路径上的数的乘积的最少末尾0的个数,容易想到把“10”分解成“2”和“5”,那么答案就是“2”和“5”中计数少的那个。如果只用一次DP过程同时求解当前“2”或“5”的次数会发现前面出现的“2”或“5”的次数完全无法确定当前位置的值(这种类似贪心的算法是错误的)。那么可以想到将“2”和“5”两个数字分开,分别进行一次DP,题目要求的只是终点的值的末尾0的个数,那么答案就是终点值“2”和“5”中计数少的对应出现的次数。

  对于矩阵中出现0的情况要特殊处理,看是否有一条路使得终值的末尾0的个数为0,是的话答案为0,打印出当前路径;否则,答案为1,打印出经过元素0的任一路径。

  这道题通过数次提交发现:C++相对于g++来说,对数组越界情况会更严格一些。

View Code

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <algorithm>
  4 #define FOR(i,s,t) for(int i=(s); i<(t); i++)
  5 const int maxn = 1000 + 2;
  6
  7 int d2[maxn][maxn], d5[maxn][maxn], a[maxn][maxn], n, u, v;
  8 char dr2[maxn][maxn], dr5[maxn][maxn];
  9 bool flag;
 10
 11 int cal(int x, int p)
 12 {
 13     if(x == 0)
 14         return 1;
 15     int cnt = 0;
 16     while(x % p == 0)
 17     {
 18         cnt ++;
 19         x /= p;
 20     }
 21     return cnt;
 22 }
 23
 24 void DP(int d[][maxn], char dr[][maxn], int p)
 25 {
 26     FOR(i, 0, n)
 27         d[0][i] = (i == 0 ? 0 : d[0][i-1]) + cal(a[0][i], p), dr[0][i] = 'R'; // 这里i == 0的情况要注意越界问题,不特判一下C++下会错,但g++能A
 28     FOR(i, 1, n)
 29     {
 30         FOR(j, 0, n)
 31         {
 32             if(j == 0)
 33             {
 34                 d[i][j] = d[i - 1][j] + cal(a[i][j], p);
 35                 dr[i][j] = 'D';
 36             }
 37             else
 38             {
 39                 if(d[i - 1][j] < d[i][j - 1])
 40                 {
 41                     d[i][j] = d[i - 1][j] + cal(a[i][j], p);
 42                     dr[i][j] = 'D';
 43                 }
 44                 else
 45                 {
 46                     d[i][j] = d[i][j - 1] + cal(a[i][j], p);
 47                     dr[i][j] = 'R';
 48                 }
 49             }
 50         }
 51     }
 52 }
 53
 54 void printway(char dr[][maxn], int x, int y)
 55 {
 56     if(x == 0 && y == 0)
 57         return ;
 58     if(dr[x][y] == 'D')
 59         printway(dr, x - 1, y);
 60     else
 61         printway(dr, x, y - 1);
 62     putchar(dr[x][y]);
 63 }
 64
 65 void read()
 66 {
 67     flag = false;
 68     FOR(i, 0, n)
 69         FOR(j, 0, n)
 70         {
 71             scanf("%d", &a[i][j]);
 72             if(a[i][j] == 0)
 73             {
 74                 flag = true;
 75                 u = i, v = j;
 76             }
 77         }
 78 }
 79
 80 int main()
 81 {
 82     while(scanf("%d", &n) == 1)
 83     {
 84         read();
 85         DP(d2, dr2, 2);
 86         DP(d5, dr5, 5);
 87         if(flag)
 88         {
 89             if(d2[n - 1][n - 1] == 0)
 90             {
 91                 printf("0\n");
 92                 printway(dr2, n - 1, n - 1);
 93             }
 94             else if(d5[n - 1][n - 1] == 0)
 95             {
 96                 printf("0\n");
 97                 printway(dr5, n - 1, n - 1);
 98             }
 99             else
100             {
101                 printf("1\n");
102                 FOR(i, 0, u) putchar('D');
103                 FOR(i, 0, n - 1) putchar('R');
104                 FOR(i, u, n - 1) putchar('D');
105             }
106         }
107         else
108         {
109             if(d2[n-1][n-1] < d5[n-1][n-1])
110             {
111                 printf("%d\n", d2[n-1][n-1]);
112                 printway(dr2, n - 1, n - 1);
113             }
114             else
115             {
116                 printf("%d\n", d5[n-1][n-1]);
117                 printway(dr5, n - 1, n - 1);
118             }
119         }
120         putchar('\n');
121     }
122     return 0;
123 }

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/11/26/2789079.html

CodeForces 2B The least round way相关推荐

  1. CodeForces - 2B The least round way

    B. The least round way time limit per test2 seconds memory limit per test64 megabytes inputstandard ...

  2. The least round way CodeForces - 2B (DP 矩阵 路径)

    题意:n * n的数字矩阵,只能向下走和向右走,要求走的数字的积的后面的0最少,求最少的0和路径之一 题解:0 的情况2 种 2 *  5 和乘以 0,记录每个数字分解的2 和 5 的数量,从左上角到 ...

  3. Codeforces Technocup 2017 - Elimination Round 2 E Subordinates(贪心)

    题目链接 http://codeforces.com/contest/729/problem/E 题意:给你n个人,主管id为s,然后给你n个id,每个id上对应一个数字表示比这个人大的有几个. 最后 ...

  4. CF 2B The least round way DP+Math

    题意: 找出一条路, 使每个节点相乘,得到的数末尾 0 最少 每次移动只能向右或者向下, 找到后打印路径 ///按照题目要求,就是找出一条从左上角到右下角中每个数含2 or 5 最少的路 ///可以用 ...

  5. CF 2B.The least round way

    题目链接 很久以前就见过此题,以前看了题解,然后今天写了写,写的真搓. 1 #include <cstdio> 2 #include <cstring> 3 #include ...

  6. Technocup 2020 - Elimination Round 2 E. Rock Is Push dp

    传送门 文章目录 题意: 思路 题意: 给你一个n×mn×mn×m的方格,你初始在(1,1)(1,1)(1,1)点,有些位置有箱子,你可以走到某个位置向你的方向推动这个箱子,箱子不能出界,问你走到(n ...

  7. 【笔记】0-1 bfs

    简介0-1 bfs bfs可以O(V+E)求解边权全为1的图上最短路. 而当边权只有0或1时,使用其它最短路算法是有些浪费的,此时可以使用bfs的变种:0-1 bfs来快速求解,复杂度仍为O(V+E) ...

  8. Codeforces Beta Round #2--B题 (DP)

    题目:The least round way 1000*1000的方阵,每个格子有一个非负整数,现在要从左上走到右下,每次只能向下或者向右走.目标是使得所有走的格子里的数的乘积里,末尾0的个数最少,要 ...

  9. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  10. Codeforces Round #698 (Div. 2)(A ~ F)6题全,超高质量题解)【每日亿题】2021/2/4

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 [每日亿题]Codeforces Round #698 (Div. 2)(A ~ F)6题全,超 ...

最新文章

  1. java 反序列化漏洞简介
  2. 这个开源项目...看了就停不下来啊!
  3. tomcat端口被占用如何解决
  4. 怎样编译libdb_比特币编译(Ubuntu 16.04)
  5. python2中的unicode_在python 3和2中工作的Unicode文字
  6. 用户画像是怎么生成出来的?
  7. spring中文参考手册-核心技术_ioc
  8. 你知道配置管理工具是什么吗_什么是配置管理工具?
  9. IIC软件模拟-读写EEPROM
  10. android上方导航条跳转页面,Native Navigation导航组件的使用说明
  11. aspose.word给表格插入行或列
  12. 2019-2020年目标跟踪论文汇总
  13. omnet++中tictoc实例(中文注释) 1-6
  14. 微信开发 · 缓存问题
  15. TeamViewer——一款强大的远程控制工具
  16. 数字图像处理(1)——认识数字图像
  17. 我的ROS学习之路——动起来的小海龟
  18. ​iPhone 14 Pro 全系降价 700 元;Gmail 之父:有了 ChatGPT,搜索引擎活不过两年了|极客头条...
  19. 开发微商城分销系统有什么优势?
  20. ubuntu 安装MySQL8

热门文章

  1. Eureka Server 开启身份验证与客户端注册
  2. CSS3 box-shadow 设置元素阴影、text-shadow 设置文本阴影
  3. 阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
  4. Web.xml in Hello1 project
  5. 设计模式系列 - 装饰器模式
  6. 剑指offer-数值的整数次方
  7. 【TP】TP如何向模板中的js传变量
  8. Python中and(逻辑与)计算法则
  9. javascript继承机制的设计思想(ryf)
  10. [c# 20问] 4.Console应用获取执行路径