CodeForces 2B The least round way
原题传送: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++来说,对数组越界情况会更严格一些。
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相关推荐
- CodeForces - 2B The least round way
B. The least round way time limit per test2 seconds memory limit per test64 megabytes inputstandard ...
- The least round way CodeForces - 2B (DP 矩阵 路径)
题意:n * n的数字矩阵,只能向下走和向右走,要求走的数字的积的后面的0最少,求最少的0和路径之一 题解:0 的情况2 种 2 * 5 和乘以 0,记录每个数字分解的2 和 5 的数量,从左上角到 ...
- Codeforces Technocup 2017 - Elimination Round 2 E Subordinates(贪心)
题目链接 http://codeforces.com/contest/729/problem/E 题意:给你n个人,主管id为s,然后给你n个id,每个id上对应一个数字表示比这个人大的有几个. 最后 ...
- CF 2B The least round way DP+Math
题意: 找出一条路, 使每个节点相乘,得到的数末尾 0 最少 每次移动只能向右或者向下, 找到后打印路径 ///按照题目要求,就是找出一条从左上角到右下角中每个数含2 or 5 最少的路 ///可以用 ...
- CF 2B.The least round way
题目链接 很久以前就见过此题,以前看了题解,然后今天写了写,写的真搓. 1 #include <cstdio> 2 #include <cstring> 3 #include ...
- Technocup 2020 - Elimination Round 2 E. Rock Is Push dp
传送门 文章目录 题意: 思路 题意: 给你一个n×mn×mn×m的方格,你初始在(1,1)(1,1)(1,1)点,有些位置有箱子,你可以走到某个位置向你的方向推动这个箱子,箱子不能出界,问你走到(n ...
- 【笔记】0-1 bfs
简介0-1 bfs bfs可以O(V+E)求解边权全为1的图上最短路. 而当边权只有0或1时,使用其它最短路算法是有些浪费的,此时可以使用bfs的变种:0-1 bfs来快速求解,复杂度仍为O(V+E) ...
- Codeforces Beta Round #2--B题 (DP)
题目:The least round way 1000*1000的方阵,每个格子有一个非负整数,现在要从左上走到右下,每次只能向下或者向右走.目标是使得所有走的格子里的数的乘积里,末尾0的个数最少,要 ...
- Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...
- Codeforces Round #698 (Div. 2)(A ~ F)6题全,超高质量题解)【每日亿题】2021/2/4
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 [每日亿题]Codeforces Round #698 (Div. 2)(A ~ F)6题全,超 ...
最新文章
- java 反序列化漏洞简介
- 这个开源项目...看了就停不下来啊!
- tomcat端口被占用如何解决
- 怎样编译libdb_比特币编译(Ubuntu 16.04)
- python2中的unicode_在python 3和2中工作的Unicode文字
- 用户画像是怎么生成出来的?
- spring中文参考手册-核心技术_ioc
- 你知道配置管理工具是什么吗_什么是配置管理工具?
- IIC软件模拟-读写EEPROM
- android上方导航条跳转页面,Native Navigation导航组件的使用说明
- aspose.word给表格插入行或列
- 2019-2020年目标跟踪论文汇总
- omnet++中tictoc实例(中文注释) 1-6
- 微信开发 · 缓存问题
- TeamViewer——一款强大的远程控制工具
- 数字图像处理(1)——认识数字图像
- 我的ROS学习之路——动起来的小海龟
- ​iPhone 14 Pro 全系降价 700 元;Gmail 之父:有了 ChatGPT,搜索引擎活不过两年了|极客头条...
- 开发微商城分销系统有什么优势?
- ubuntu 安装MySQL8
热门文章
- Eureka Server 开启身份验证与客户端注册
- CSS3 box-shadow 设置元素阴影、text-shadow 设置文本阴影
- 阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
- Web.xml in Hello1 project
- 设计模式系列 - 装饰器模式
- 剑指offer-数值的整数次方
- 【TP】TP如何向模板中的js传变量
- Python中and(逻辑与)计算法则
- javascript继承机制的设计思想(ryf)
- [c# 20问] 4.Console应用获取执行路径