B. The least round way
time limit per test

2 seconds

memory limit per test

64 megabytes

input

standard input

output

standard output

There is a square matrix n × n, consisting of non-negative integer numbers. You should find such a way on it that

  • starts in the upper left cell of the matrix;
  • each following cell is to the right or down from the current cell;
  • the way ends in the bottom right cell.

Moreover, if we multiply together all the numbers along the way, the result should be the least "round". In other words, it should end in the least possible number of zeros.

Input

The first line contains an integer number n (2 ≤ n ≤ 1000), n is the size of the matrix. Then follow n lines containing the matrix elements (non-negative integer numbers not exceeding 109).

Output

In the first line print the least number of trailing zeros. In the second line print the correspondent way itself.

Examples
input

Copy

3
1 2 3
4 5 6
7 8 9

output

Copy

0
DDRR

题意:给你一个n*n的矩阵 只能向下或者向右 问你从左上角走到左下角 你走过路径上数字的乘积尾部0个数最少的走法

思路:我们知道只有2和5的组合可以让尾部为0 所以我们可以预处理每个数字有多少个2和5 然后很容易得出方程dp[i][j][0/1]=min(dp[i-1][j][0/1],dp[i][j-1][0/1])+a[i][j][0/1]

值得注意的是 如果其中有出现0这个数字 那么就表示 只要经过这个点 那么尾部0的个数必然是1 那么答案就只能在0或者1中产生

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<time.h>
#include<queue>
#define ll long long int
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[]={,,,,,,,,,,,,};
int dir[][]={, ,, ,-, ,,-};
int dirs[][]={, ,, ,-, ,,-, -,- ,-, ,,- ,,};
const int inf=0x3f3f3f3f;
const ll mod=1e9+;
int dp[][][]; //0表示2的个数 1表示5的个数
int a[][]; //存矩阵
bool f=;
struct node{
int x;int y;
};
node path2[][]; //记录2的个数最少时的路径
node path1[][]; //记录5的个数最少时的路径
node ans[];
int cnt=;
void output1(node x){ //记录答案
if(x.x==&&x.y==) return ;
node t; t=path1[x.x][x.y];
output1(t);
ans[++cnt]=x;
}
void output2(node x){ //记录答案
if(x.x==&&x.y==) return ;
node t; t=path2[x.x][x.y];
output2(t);
ans[++cnt]=x;
}
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
int posx,posy;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
cin>>a[i][j];
int t=a[i][j];
if(t==){ //一但出现零我们需要标记一下
f=;
dp[i][j][]++;
dp[i][j][]++;
posx=i;
posy=j;
continue;
}
while(){ //统计2 和 5 的个数
if(t%==){
t/=;
dp[i][j][]++;
}else if(t%==){
t/=;
dp[i][j][]++;
}else{
break;
}
}
}
for(int i=;i<=n;i++){ // 预处理边界
dp[][i][]+=dp[][i-][];
dp[][i][]+=dp[][i-][];
node t; t.x=; t.y=i-;
path1[][i]=path2[][i]=t;
dp[i][][]+=dp[i-][][];
dp[i][][]+=dp[i-][][];
t.x=i-; t.y=;
path1[i][]=path2[i][]=t;
}
path1[][].x=path2[][].x=;
path1[][].y=path2[][].y=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){ //递推
if(dp[i-][j][]<dp[i][j-][]){
dp[i][j][]=dp[i-][j][]+dp[i][j][];
node temp; temp.x=i-; temp.y=j;
path1[i][j]=temp;
}else{
dp[i][j][]=dp[i][j-][]+dp[i][j][];
node temp; temp.x=i; temp.y=j-;
path1[i][j]=temp;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){ //递推
if(dp[i-][j][]<dp[i][j-][]){
dp[i][j][]=dp[i-][j][]+dp[i][j][];
node temp; temp.x=i-; temp.y=j;
path2[i][j]=temp;
}else{
dp[i][j][]=dp[i][j-][]+dp[i][j][];
node temp; temp.x=i; temp.y=j-;
path2[i][j]=temp;
}
}
int minn=min(dp[n][n][],dp[n][n][]);
if(minn>&&f){ //表示尾部零最小的个数就是1 那么我们就可以直接输出
cout<<""<<endl;
for(int i=;i<posx;i++)
cout<<"D";
for(int j=;j<posy;j++)
cout<<"R";
for(int i=posx;i<n;i++)
cout<<"D";
for(int j=posy;j<n;j++)
cout<<"R";
cout<<endl;
return ;
}
cout<<minn<<endl;
node e; e.x=n; e.y=n;
if(dp[n][n][]<dp[n][n][])
output1(e);
else{
output2(e);
}
for(int i=;i<=cnt;i++){
if(ans[i].x==ans[i-].x+)
cout<<"D";
else
cout<<"R";
}
cout<<endl;
return ;
}

CF2B The least round way(dp+记录路径)的更多相关文章

  1. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  2. Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)

    E. Fire time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  3. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

  4. [CF2B] The least round way - dp

    给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径: 以左上角为起点 每次只能向右或向下走 以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小"round" ...

  5. uva 10453 - Make Palindrome(dp, 记录路径)

    题目 题意: 给一个字符串 ,判断最少插入多少个字符 使字符串成为回文串, 并输出回文串. 思路:先用dp判断需要个数, 再递归输出路径. #include <iostream> #inc ...

  6. codeforces 1272F dp+记录路径

    题意 给出两个括号序列 \(S\) 和 \(T\),让你构造一个最短的合法括号序列使 \(S\) 和 \(T\) 是它的子序列. 分析 设 \(dp[i][j][k]\) 为这个最短的合法括号序列的前 ...

  7. POJ 题目1141 Brackets Sequence(区间DP记录路径)

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27793   Accepted: 788 ...

  8. POJ 2111 DP+记录路径

    题意: 思路: 类似滑雪 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm& ...

  9. hdu1074 状压DP、栈实现记录路径

    题意:给了几门学科作业.它们的截止提交期限(天数).它们的需要完成的时间(天数),每项作业在截止日期后每拖延一天扣一学分,算最少扣的学分和其完成顺序. 一开始做的时候,只是听说过状态压缩这个神奇的东西 ...

随机推荐

  1. C# MessageBox自动关闭

    本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭.特别是一些第三方插件(如:dll)弹出的对话框,最为适用.本文仅供学习分享使用,如有不足之处,还请指正. 概述 ...

  2. Android 运行报错 Unknown failure (at android.os.Binder.execTransact(Binder.java:681)) Error while Installing APKs 解决办法

    今天,我用手机测试的时候出现了这个错误 我网站查找了一会资料, 在运行的时候出现提示大致意思:卸载删除已存在应用程序,是否卸载现有应用程序,点击ok就会出现如下错误 原应用程序也没有卸载,然后自己手动 ...

  3. Linux LVM学习总结——Insufficient Free Extents for a Logical Volume

    如下所示,在创建LV的时候,偶尔会遇到"Volume group "xxxx" has insufficient free space (xxxx extents): x ...

  4. sql server 错误日志errorlog

    一 .概述 SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应用程序日志中. 这两种日志都会自动给所有记录事件加上时间戳 ...

  5. Python开发【第五篇】内置函数

    abs() 函数返回数字的绝对值 __author__ = "Tang" a = -30 all() 函数用于判断给定的可迭代参数iterable中的所有元素是否都为True,如果 ...

  6. MongoDB install

    下载地址1:https://www.mongodb.org/dl/linux下载地址2:https://www.mongodb.com/download-center/community关于Mongo ...

  7. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  8. 【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题

    正文 功能 用 UICollectionView 实现两个 cell 之间的位置交互或者拖拽某个位置删除 问题 iOS 11 以上拖拽删除会崩溃,在 iOS 9.10 都没有问题 错误 017-10- ...

  9. 个人hp笔记本默认设置更改

    1.将F1-F12默认的多媒体键(调静音亮度控制声音大小等)改为功能键: (****笔记本型号为惠普****) ·进入BIOS方法:关机状态下,按电源键开机,立刻连续多次点击ESC,看到 F1.F2. ...

  10. ORM框架SQLAlchemy

    SQLAlchemy orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是类似python这种面向对象的程序来说一切皆对象,但是使用的数据库却都是关系型 ...