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 ...
随机推荐
- 【170】◀▶ IDL 学习初体验-全
IDL Reference 操作符号 数组 字符及字符串 结构体 指针 链表 & 哈希表 程序控制(循环.条件.跳转语句) 过程 & 函数 输入与输出 系统变量 文件系统操作 直接图形 ...
- mac+php+xdebug
1,下载xdebug 2,进入xdebug-2.4.0RC4目录,运行phpize命令, 2,google之后说要安装autoconf brew install autoconf 3,但是使用brew ...
- E20180127-hm
retain vt. 保持; 留在心中,记住; 雇用; 付定金保留;
- Linux 搭建Discuz论坛
title: Linux 搭建Discuz论坛 Welcome to Fofade's Blog! 这里是Linux 搭建论坛的一些命令记录 命令摘记: 下载文件:Discuz 安装环境:PHP Ap ...
- 用 jQuery 实现简单倒计时功能
问题场景:假设某个活动截止时间给定了,现在需要开发一个页面可以自动刷新距离活动截止时间还剩多少天? <!DOCTYPE html> <html xmlns="http:// ...
- 使用Oracle的DBMS_SQL包执行动态SQL语句
引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...
- 全面学习ORACLE Scheduler特性(3)使用Programs
二.使用Programs 在论坛中偶尔见过有人讨论如何在ORACLE中执行操作系统命令,或是ORACLE数据库外的应用.应该说在9i及之前的版本中,虽然说并非完全无法实现(其实还是有多种方式能够变相实 ...
- 【LeetCode】LeetCode Weekly Contest 16B
2.一个游戏 YouTube MIT 算法课上有详细的讲解 思路是DP. 话说MIT OpenCourseWare 真心不错.应该好好看看,讲的详细生动. Tips: 1.当n是偶数的时候,首先的选择 ...
- 389 Find the Difference 找不同
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母.示例:输入:s = "abcd"t = ...
- Disruptor源码解读
上一篇已经介绍了Disruptor是什么?简单总结了为什么这么快?下面我们直接源码搞起来,简单粗暴.高性能队列disruptor为什么这么快? 一.核心类接口 Disruptor 提供了对RingBu ...