CF2B The least round way

【题解】
可以发现10的因数除了1和10之外只有2和5了,那么走过的路径上各个数字的2的因数个数之和、5的因数个数之和中较小的一个即是答案。这样的话DP即可。同时需要注意有0的情况,有0的时候有一个答案为1,要和前面求出的答案取较小值。
#include<cstdio>
#include<algorithm>
#define LL long long
#define rg register
#define N 1010
using namespace std;
int n,m,px,py,tot,a[N][N],f[N][N],f2[N][N],exp2[N],exp5[N];
bool flag=;
struct rec{
int x,y;
}from[N][N],from2[N][N];
char ans[N<<];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
int main(){
n=read(); exp2[]=exp5[]=;
for(rg int i=;i<=;i++) exp2[i]=exp2[i-]<<;
for(rg int i=;i<=;i++) exp5[i]=exp5[i-]*;
for(rg int i=;i<=n;i++)
for(rg int j=;j<=n;j++){
a[i][j]=read();
if(!a[i][j]){
flag=; px=i; py=j; continue;
}
int tmp=a[i][j];
for(rg int k=;k;k--) if(tmp%exp2[k]==) f[i][j]+=k,tmp/=exp2[k];
while(tmp%==) f[i][j]++;
tmp=a[i][j];
for(rg int k=;k;k--) if(tmp%exp5[k]==) f2[i][j]+=k,tmp/=exp5[k];
while(tmp%==) f2[i][j]++;
// while(tmp%2==0){
// f[i][j]++;
// tmp>>=1;
// }
// tmp=a[i][j];
// while(tmp%5==0){
// f2[i][j]++;
// tmp/=5;
// }
}
for(rg int i=;i<=n;i++) f[i][]=f[][i]=f2[i][]=f2[][i]=2e9;
// f[1][0]=f[0][1]=f2[1][0]=f2[0][1]=0;
for(rg int i=;i<=n;i++)
for(rg int j=;j<=n;j++){
if(f[i-][j]<f[i][j-]){
from[i][j]=(rec){i-,j};
f[i][j]+=f[i-][j];
}
else{
from[i][j]=(rec){i,j-};
f[i][j]+=f[i][j-];
}
}
for(rg int i=;i<=n;i++)
for(rg int j=;j<=n;j++){
if(f2[i-][j]<f2[i][j-]){
from2[i][j]=(rec){i-,j};
f2[i][j]+=f2[i-][j];
}
else{
from2[i][j]=(rec){i,j-};
f2[i][j]+=f2[i][j-];
}
}
if(flag){
if(min(f[n][n],f2[n][n])>){
puts("");
for(rg int i=;i<=px;i++) putchar('D');
for(rg int i=;i<=py;i++) putchar('R');
for(rg int i=px+;i<=n;i++) putchar('D');
for(rg int i=py+;i<=n;i++) putchar('R');
return ;
}
}
printf("%d\n",min(f[n][n],f2[n][n]));
if(f[n][n]<f2[n][n]){
int nx=n,ny=n;
while(){
int fx=from[nx][ny].x,fy=from[nx][ny].y;
if(fx==||fy==) break;
if(fx<nx) ans[++tot]='D';
else ans[++tot]='R';
nx=fx; ny=fy;
if(fx==&&fy==) break;
}
}
else{
int nx=n,ny=n;
while(){
int fx=from2[nx][ny].x,fy=from2[nx][ny].y;
if(fx==||fy==) break;
if(fx<nx) ans[++tot]='D';
else ans[++tot]='R';
nx=fx; ny=fy;
if(fx==&&fy==) break;
}
}
for(rg int i=tot;i;i--) putchar(ans[i]);
// puts("");
// for(rg int i=1;i<=n;i++){
// for(rg int j=1;j<=n;j++) printf("[%d %d] ",from2[i][j].x,from2[i][j].y);
// puts("");
// }
return ;
}
CF2B The least round way的更多相关文章
- CF2B The least round way(贪心+动规)
题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...
- CF2B The least round way(dp+记录路径)
B. The least round way time limit per test 2 seconds memory limit per test 64 megabytes input standa ...
- CF2B The least round way 题解
都是泪呀...↑ 题目传送门 题意(直接复制了QWQ) 题目描述 给定由非负整数组成的\(n \times n\)的正方形矩阵,你需要寻找一条路径: 以左上角为起点, 每次只能向右或向下走, 以右下角 ...
- [CF2B] The least round way - dp
给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径: 以左上角为起点 每次只能向右或向下走 以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小"round" ...
- SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等
在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...
- SQL中Round(),Floor(),Ceiling()函数的浅析
项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...
- oracle的round函数和trunc函数
--Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
随机推荐
- makefile 参数
GNU Make make是负责从项目的源代码中生成最终可执行文件和其他非源代码文件的工具. make命令本身可带有四种参数:标志.宏定义.描述文件名和目标文件名. 其标准形式为:make [flag ...
- A bad vacation
My story happened in the winter of 2012, the first year I began to work in Beijing. It was a cold we ...
- bzoj1050
最小生成树 其实这道题是最小生成树的变种,我们发现答案不一定在最小/最大生成树上,最短路算法也不可行,因为我们我们并不是希望最小值尽量的大,最大值尽量的小,这样不一定是最优的,那么我们枚举最小的边,然 ...
- window系统 查看端口 被哪个进程占用了
一.在windows命令行窗口下执行:运行--cmdC:\>netstat -aon|findstr "8080" TCP 127.0.0.1:80 0. ...
- IntelliJ IDEA 安装目录的核心文件讲解
转自:https://blog.csdn.net/qq_35246620/article/details/61916751 首先,我们回顾一下前两篇关于 IntelliJ IDEA 的博文的内容: 在 ...
- Linux安装PHP环境
简介: PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要 ...
- gauge自动化测试框架(二)
Gauge通过Markdown来描述行为,所以我还需先学习学习Markdown语法,看了一下,还好,十来分钟应该就可以搞定.具体学习见另一篇文章
- 300 Longest Increasing Subsequence 最长上升子序列
给出一个无序的整形数组,找到最长上升子序列的长度.例如,给出 [10, 9, 2, 5, 3, 7, 101, 18],最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可能会有 ...
- PHP安装yaf在ubuntu下面的问题解决
1.在执行make的时候出现如下错误: In file included from /root/yaf-2.1.2/yaf_router.c:28: /usr/include/php/ext/pcre ...
- CF897C Nephren gives a riddle
思路: 递归. 比赛的时候脑抽了len[]没算够,wa了几次. 实现: #include <bits/stdc++.h> using namespace std; using ll = l ...