codeforces 2B The least round way(DP+数学)
The least round way
题目链接:http://codeforces.com/contest/2/problem/B
——每天在线,欢迎留言谈论。PS.本题有什么想法、建议、疑问 欢迎留言!!
题目大意:
①第一行给你一个n,表示接下来将给你一个n阶方阵的数据
②要求你从左上方出发到右下方,路径上所有数字乘积 的末尾0的个数最少
③输出最少0的个数,并输出路径
PS:①每次只能向右或向走 ②D表示向下走,R表示向右 ③0乘任何数的结果 末尾都是一个0;
知识点:
①多个数字相乘,末尾0个个数为:每个乘数分解质因数后 min(2的个数,5的个数);
②基本的DP(动态规划)- 本题dp出2、5 个数的最小值。
思路:
①末尾0个个数只跟线路上2、5的个数有关,所以读入数据时只要保存 2、5的个数即可
②通过dp,分别找出 2个数最小的路和5个数最小的路。
③那么结果有情况:下面用num2、num5表示 2、5最小的个数
④由于0比较特殊 所以需要考虑 (①把他当作10②记入第一个0的位子)(自己想为什么可以喽。。哈哈)
Ⅰ. num2、num5 当中全为0或其中一个为0
代表有某条路乘级末尾无0;直接输出。
Ⅱ . 如果输入数据中有0,那么0乘任何数末尾都是一个0,直接输出带0的一条路即可
Ⅲ . 其他无0情况 输出 min(num2,num5) 那条路就可以了!
感想:
这题的难点在于 对多个数相乘末尾0的个数性质的了解 和 对有0的处理 。
o.o 这个题要考虑的细节确实有点多,需要慢慢考虑。
o.o 输出的部分我既然写了40行代码。。。
PS.本题有什么想法、建议、疑问 欢迎留言!!
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=;
const int inf=0x3f3f3f3f;
struct node
{
int times[];
node(int a=,int b=){times[]=a;times[]=b;}
};
//----这里有几个全局变量↓
node matrix[MAXN][MAXN];int n;//记录每个点的质因子2 5的个数
bool isfind[MAXN][MAXN],ishavezero=false;//dp 时 记忆化搜索用
int zeroy=;
//----这里有几个全局变量↑
int get_num(int num,int y)
{//获取数字num 质因子中 y 的个数
int temp=;
while(num!=&&num%y==)
{
temp++;
num/=y;
}
return temp;
}
int dp(int y,int i=,int j=)//动态规划:通过记忆搜索的方法
{//y用来表示dp的是2还是5 y=0为2 y=1为5 ps.node结构体中int times[2];节省重复代码
if(isfind[i][j])//是否已搜索过
return matrix[i][j].times[y];
isfind[i][j]=true;
if(i==n&&j==n)//开始边界处理
{return matrix[i][j].times[y];}
else if(i==n)
return matrix[i][j].times[y]=matrix[i][j].times[y]+dp(y,i,j+);
else if(j==n)
return matrix[i][j].times[y]=matrix[i][j].times[y]+dp(y,i+,j);
//中间一般情况
return matrix[i][j].times[y]=matrix[i][j].times[y]+min(dp(y,i+,j),dp(y,i,j+));
}
void putout()
{//开始输出答案 ps.输出答案 写了40行的代码。。。。我也是lj
int y=;
if(matrix[][].times[]>matrix[][].times[])
y=;
if(ishavezero&&matrix[][].times[y]>)
{
cout<<""<<endl;
for(int i=;i<n;)
{
if(i==zeroy)
{
for(int j=;j<n;j++)
cout<<"D";
}
cout<<"R";i++;
}
return ;
}
cout<<matrix[][].times[y]<<endl;
for(int i=;i<=n;)
for(int j=;j<=n;)
{
if(j==n&&i==n)return ;
else if(j==n)
{for(int t=i;t<n;t++)
cout<<"D";return ;
}
else if(i==n)
{for(int t=j;t<n;t++)
cout<<"R";return ;
}
if(matrix[i+][j].times[y]<=matrix[i][j+].times[y])
{
cout<<"D";
i++;
}
else
{cout<<"R";j++;}
}
cout<<endl;
}
int main()
{
int temp;//接受输入的数
cin>>n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
cin>>temp;
if(!temp)
{temp=;if(!ishavezero){ishavezero=true;zeroy=j;}}
matrix[i][j]=node(get_num(temp,),get_num(temp,));
}
memset(isfind,,sizeof(isfind));//out();
dp();
memset(isfind,,sizeof(isfind));
dp();//out();
putout();
return ;
}
2017-05-12 13:21:50
codeforces 2B The least round way(DP+数学)的更多相关文章
- Codeforces #2B The least round way(DP)
Description 有一个n*n的正整数矩阵,要你求一条从第一行第一列的格子到第n行第n列的路,使得你走过的格子里面的数乘起来的值末尾的零的个数最小.输出最小个数. Input 第一行包括1个数n ...
- Codeforces 2B The least round way(dp求最小末尾0)
题目链接:http://codeforces.com/problemset/problem/2/B 题目大意: 给你一个nxn的矩形,找到一条从左上角到右下角的路径,使得该路径上所有数字的乘积的末尾0 ...
- codeforces 2B The least round way 【DP】
VJ上可找到中文题意. 思路: 首先分解有多少2与多少5.接下来就是dp. 分两次,一次是根据2的数量贪心,另外一次是根据5的数量贪心,看哪一次乘积的末尾0最少. 需要注意的是两点: 1.输入有0的情 ...
- Codeforces 2B. The least round way
There is a square matrix n × n, consisting of non-negative integer numbers. You should find such a w ...
- CodeForces 55D Beautiful numbers(数位dp+数学)
题目链接:http://codeforces.com/problemset/problem/55/D 题意:一个美丽数就是可以被它的每一位的数字整除的数. 给定一个区间,求美丽数的个数. 显然这是一道 ...
- codeforces 264 B. Good Sequences(dp+数学的一点思想)
题目链接:http://codeforces.com/problemset/problem/264/B 题意:给出一个严格递增的一串数字,求最长的相邻两个数的gcd不为1的序列长度 其实这题可以考虑一 ...
- 最小较小codeforces 2B The least round way
查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记载吧! 求从左上角到右下角所经过的数字之积末端所含0最小的个数 终究的积可以当作A*2^x*5^y, ...
- CF 2B The least round way DP+Math
题意: 找出一条路, 使每个节点相乘,得到的数末尾 0 最少 每次移动只能向右或者向下, 找到后打印路径 ///按照题目要求,就是找出一条从左上角到右下角中每个数含2 or 5 最少的路 ///可以用 ...
- [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】
[CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...
随机推荐
- 多线程的音频打标记的python实现(原创)
技术难度: ①需要一个UI界面,并且其中可进行相关参数的自调,最开始使用的是pygame的框架,后来转用tk界面: ②需要可以播放音频文件,MP3.WMA等格式: ③需要在播放音频的同时进行打标签操作 ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- sql server I/O硬盘交互
一. 概述 sql server作为关系型数据库,需要进行数据存储, 那在运行中就会不断的与硬盘进行读写交互.如果读写不能正确快速的完成,就会出现性能问题以及数据库损坏问题.下面讲讲引起I/O的产生, ...
- Java集合框架总结—超详细-适合面试
Java集合框架总结—超详细-适合面试 一.精简: A.概念汇总 1.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口, ...
- 一个BAT老程序员的忠告!
一.在中国,你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你更不要认为那些从事市场.运营的人,没有前途. 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的 ...
- Elasticsearch实践(二):搜索
本文以 Elasticsearch 6.2.4为例. 经过前面的基础入门,我们对ES的基本操作也会了.现在来学习ES最强大的部分:全文检索. 准备工作 批量导入数据 先需要准备点数据,然后导入: wg ...
- Linux常用命令之网络和关机重启命令
目录 1.网络命令 一.给指定用户发送信息:write 二.给所有用户发送广播信息:wall 三.测试网络连通性:ping 四.查看和设置网卡信息:ifconfig 五.查看发送电子邮件:mail 六 ...
- MySQL模糊匹配查询like、regexp、in
MySQL提供标准的SQL模式匹配,以及一种基于像Unix实用程序,如:vi.grep和sed的扩展正则表达式模式匹配的格式 一.SQL模式(% ,_) SQL的模式匹配允许你使用“_”匹配任何单个字 ...
- 手把手使用Docker搭建SpringBoot微服务镜像
一.环境准备 1.安装好Docker环境的Linux机器(安装教程) 2.准备好SpringBoot项目打包好的可运行jar包 二.编写Dockerfile 1.首先将SpringBoot打包好的ja ...
- http无状态协议,cookie和session详解(一)
1.HTTP无状态协议 首先看百度百科给出的定义: HTTP无状态协议,是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传, 这样导致可能每次连接传送的数据量增大 ...