2B The least round way

传送门

题目

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

31 2 34 5 67 8 9

Output

0DDRR

题目大意

给定由非负整数组成的 n×nn \times nn×n 的正方形矩阵,你需要寻找一条路径:

以左上角为起点,每次只能向右或向下走

以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小“round”,换句话说,应当以最小数目的0的结尾.

输入格式

第一行包含一个整数 n ( 2≤n≤10002 \leq n \leq 10002≤n≤1000 ),n 为矩阵的规模,接下来的n行包含矩阵的元素(不超过10^9的非负整数).

输出格式

第一行应包含最小尾0的个数,第二行打印出相应的路径(译注:D为下,R为右)

分析

这是一道普通的dp题,因为最小的零的个数就是5的最少个数和2的最少个数的最小值,所以我们进行两次dp分别求出2和5的数量然后取min。特别得,如果在路径中经过0则整个过程的0的总数就是1,所以在进行完两次dp后特判一下即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int n,g[1100][1100],dp[1100][1100],now[1100][1100],best=1000000007;
string ans;
void work(int x,int y){
      if(x-1&&dp[x-1][y]+now[x][y]==dp[x][y]){
          work(x-1,y);
          ans.push_back(‘D‘);
      }else if(y-1){
          work(x,y-1);
          ans.push_back(‘R‘);
      }
}
void go(int wh){
      int i,j,k;
      memset(now,0,sizeof(now));
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
            while(g[i][j]&&g[i][j]%wh==0){
                now[i][j]++;
                g[i][j]/=wh;
            }
      memset(dp,0x3f,sizeof(dp));
      dp[1][1]=now[1][1];
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++){
             if(i-1)dp[i][j]=min(dp[i][j],dp[i-1][j]+now[i][j]);
             if(j-1)dp[i][j]=min(dp[i][j],dp[i][j-1]+now[i][j]);
         }
      if(dp[n][n]<best){
          ans="";
          best=dp[n][n];
          work(n,n);
      }
}
int main()
{     int i,j,k;
      scanf("%d",&n);
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
            scanf("%d",&g[i][j]);
      go(2);
      go(5);
      if(best>1){
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
              if(!g[i][j]){
                best=1;
                ans="";
                for(k=1;k<i;k++)ans.push_back(‘D‘);
                for(k=1;k<j;k++)ans.push_back(‘R‘);
                for(k=i;k<n;k++)ans.push_back(‘D‘);
                for(k=j;k<n;k++)ans.push_back(‘R‘);
                break;
              }
        }
      cout<<best<<endl<<ans<<endl;
      return 0;
}

原文地址:https://www.cnblogs.com/yzxverygood/p/9025919.html

时间: 2024-10-14 20:08:47

2B The least round way的相关文章

Codeforces #2B The least round way(DP)

Description 有一个n*n的正整数矩阵,要你求一条从第一行第一列的格子到第n行第n列的路,使得你走过的格子里面的数乘起来的值末尾的零的个数最小.输出最小个数. Input 第一行包含1个数n. 接下来n行每行n个数字. Output 一个数字表示末尾零最小个数. Sample Input 3 1 2 3 4 5 6 7 8 9 Sample Output 0 由于都是正数,对这个来说只需统计最少的2或5即可.相对简单. #include<cstdio> #include<cst

code force 2B The least round way

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 bott

codeforces 2B The least round way

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 bott

CF 2B The least round way DP+Math

题意: 找出一条路, 使每个节点相乘,得到的数末尾 0 最少 每次移动只能向右或者向下, 找到后打印路径 ///按照题目要求,就是找出一条从左上角到右下角中每个数含2 or 5 最少的路 ///可以用Dp的思想, 然后把每个节点该走的方向记下来 ///再从终点回溯,把路径存入栈,再输出 ///数据会有0的情况, 这时候我们应该记录离终点最近的0 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef

codeforces 2B The least round way 【DP】

VJ上可找到中文题意. 思路: 首先分解有多少2与多少5.接下来就是dp. 分两次,一次是根据2的数量贪心,另外一次是根据5的数量贪心,看哪一次乘积的末尾0最少. 需要注意的是两点: 1.输入有0的情况,要判断你的ans是不是大于1如果大于1那么输出一条经过0的路径即可. 2.当根据2的数量贪心进行dp的时候,如果可以转移的两个来源的2的数量是相同的,需要找到5的数量较小的状态转移过来. 代码较挫. #include<bits/stdc++.h> using namespace std; in

Codeforces 2B The least round way(dp求最小末尾0)

题目链接:http://codeforces.com/problemset/problem/2/B 题目大意: 给你一个nxn的矩形,找到一条从左上角到右下角的路径,使得该路径上所有数字的乘积的末尾0最少.解题思路:我们设k为2的因子数,m为5的因子数,那么一个数的末尾0的个数就是min(k,m).我们设dp[i][j][0]为从左上角到点(i,j)的乘积的最少2因子数,dp[i][j][1]为从左上角到点(i,j)的乘积的最少5因子数.那么ans=min(dp[i][j][0],dp[i][j

芘稚搪钟永fwf0ze79s

http://www.qiushibaike.com/tag/%e5%a4%a9%e9%97%a8%e5%93%aa%e9%87%8c%e6%9c%89%e8%bf%b7%e6%98%8f%e8%8d%af%e4%b9%b0%2b%ef%bd%91%ef%bc%92%ef%bc%98%ef%bc%95%ef%bc%98%ef%bc%92%ef%bc%99%ef%bc%91%ef%bc%92%ef%bc%90.http://www.gxxc.gov.cn/Town/TownDetails?id=9

抡呢耐肯聊zcak5j796bs6

http://www.gxxc.gov.cn/Town/TownDetails?id=94210&town=%e5%8f%8c%e5%9f%8e%e5%93%aa%e9%87%8c%e6%9c%89%e6%9b%b2%e9%a9%ac%e5%a4%9a%e5%8d%96%2b%ef%bd%91Q%e2%92%89%e2%92%8f%e2%92%8c%e2%92%8f%e2%92%89%e2%92%90%e2%92%88%e2%92%89O.http://www.qiushibaike.com/t

windows ping RPi 2B

/************************************************************************* * windows ping RPi 2B * 声明: * 本文主要记录如何设置RPi 2B静态IP,并且通过windows来ping通RPi 2B. * * 2016-2-15 深圳 南山平山村 曾剑锋 ************************************************************************