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;
int er[][],wu[][];
int dp[][],dpp[][];
bool from1[][],from2[][];
void print(bool p[][],int n){
stack<int>s;
int x=n-,y=n-;
while(x!=||y!=){
s.push(p[x][y]);
if(p[x][y]==)y--;
else x--;
}
while(!s.empty()){
int tmp=s.top();
s.pop();
if(tmp)printf("D");
else printf("R");
}
}
int main()
{
int n;
scanf("%d",&n);
bool ok=;
int x,y;
for(int i=;i<n;i++){
for(int j=;j<n;j++){
int tmp;
scanf("%d",&tmp);
if(tmp==){
ok=;
x=i;y=j;
continue;
}
while(tmp%==){
tmp/=;
er[i][j]++;
}
while(tmp%==){
tmp/=;
wu[i][j]++;
}
}
}
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i==){
if(j!=){
dp[i][j]=dp[i][j-]+er[i][j];
dpp[i][j]=dpp[i][j-]+wu[i][j];
from1[i][j]=;
}
else{
dp[i][j]=er[i][j];
dpp[i][j]=wu[i][j];
}
}
else{
if(j!=){
if(dp[i-][j]<dp[i][j-]){
dp[i][j]=dp[i-][j]+er[i][j];
dpp[i][j]=dpp[i-][j]+wu[i][j];
from1[i][j]=;
}
else if(dp[i-][j]==dp[i][j-]){
if(dpp[i-][j]<dpp[i][j-]){
dp[i][j]=dp[i-][j]+er[i][j];
dpp[i][j]=dpp[i-][j]+wu[i][j];
from1[i][j]=;
}
else{
dp[i][j]=dp[i][j-]+er[i][j];
dpp[i][j]=dpp[i][j-]+wu[i][j];
from1[i][j]=;
}
}
else{
dp[i][j]=dp[i][j-]+er[i][j];
dpp[i][j]=dpp[i][j-]+wu[i][j];
from1[i][j]=;
}
}
else{
dp[i][j]=dp[i-][j]+er[i][j];
dpp[i][j]=dpp[i-][j]+wu[i][j];
from1[i][j]=;
}
}
}
}
int ans=min(dp[n-][n-],dpp[n-][n-]);
memset(dp,,sizeof(dp));
memset(dpp,,sizeof(dpp));
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i==){
if(j!=){
dp[i][j]=dp[i][j-]+wu[i][j];
dpp[i][j]=dpp[i][j-]+er[i][j];
from2[i][j]=;
}
else{
dp[i][j]=wu[i][j];
dpp[i][j]=er[i][j];
}
}
else{
if(j!=){
if(dp[i-][j]<dp[i][j-]){
dp[i][j]=dp[i-][j]+wu[i][j];
dpp[i][j]=dpp[i-][j]+er[i][j];
from2[i][j]=;
}
else if(dp[i-][j]==dp[i][j-]){
if(dpp[i-][j]<dpp[i][j-]){
dp[i][j]=dp[i-][j]+wu[i][j];
dpp[i][j]=dpp[i-][j]+er[i][j];
from2[i][j]=;
}
else{
dp[i][j]=dp[i][j-]+wu[i][j];
dpp[i][j]=dpp[i][j-]+er[i][j];
from2[i][j]=;
}
}
else{
dp[i][j]=dp[i][j-]+wu[i][j];
dpp[i][j]=dpp[i][j-]+er[i][j];
from2[i][j]=;
}
}
else{
dp[i][j]=dp[i-][j]+wu[i][j];
dpp[i][j]=dpp[i-][j]+er[i][j];
from2[i][j]=;
}
}
}
}
if(ans>min(dp[n-][n-],dpp[n-][n-])){
ans=min(dp[n-][n-],dpp[n-][n-]);
if(ans>&&ok){
puts("");
for(int i=;i<x;i++){
printf("D");
}
for(int j=;j<n-;j++){
printf("R");
}
for(int i=x;i<n-;i++){
printf("D");
}
return ;
}
printf("%d\n",min(dp[n-][n-],dpp[n-][n-]));
print(from2,n);
}
else{
if(ans>&&ok){
puts("");
for(int i=;i<x;i++){
printf("D");
}
for(int j=;j<n-;j++){
printf("R");
}
for(int i=x;i<n-;i++){
printf("D");
}
return ;
}
printf("%d\n",ans);
print(from1,n);
}
}

codeforces 2B The least round way 【DP】的更多相关文章

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

    题目链接:http://codeforces.com/problemset/problem/2/B 题目大意: 给你一个nxn的矩形,找到一条从左上角到右下角的路径,使得该路径上所有数字的乘积的末尾0 ...

  2. 【非原创】codeforces - 1067A Array Without Local Maximums【dp】

    学习博客:戳这里 附本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 co ...

  3. Codeforces 447 C DZY Loves Sequences【DP】

    题意:给出一列数,在这个序列里面找到一个连续的严格上升的子串,现在可以任意修改序列里面的一个数,问得到的子串最长是多少 看的题解,自己没有想出来 假设修改的是a[i],那么有三种情况, 1.a[i]& ...

  4. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  5. 【dp】codeforces C. Vladik and Memorable Trip

    http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...

  6. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  7. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  8. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  9. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. python3多线程趣味详解

    python3的多线程很多人无法理解是怎么运行的,因此本文从程序猿的日常生活出发,写了一个由浅入深的多线程教程,这样子大家就不会觉得陌生了,多线程真的很简单很简单! 不要讲多线程局限于库或者框架,自己 ...

  2. 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)

    问题描述: 一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”.从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚.但是, ...

  3. (四)文本编辑器Vim/Vi

    目录 前言 常用命令 扩展应用 总结 本系列先前的随笔位于新浪博客 前言 Vi和Vim都是文本编辑器,不同的是Vim是Vi的升级版本,它不仅兼容Vi的所有指令,而且还有一些新的特性在里面. Vim/V ...

  4. 使用CAJViewer 提取PDF文件中的文字

    使用 CAJViewer 7.2 软件,把pdf格式的文件提取出文字. 操作步骤参考:http://jingyan.baidu.com/article/d45ad148cd06e469552b800f ...

  5. .git 目录文件介绍

    $>tree -L 1.|-- HEAD         # 这个git项目当前处在哪个分支里|-- config       # 项目的配置信息,git config命令会改动它|-- des ...

  6. Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN

    Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN.NET http://blog.csdn.net/borishuai/article/details ...

  7. 【shell】 for循环

    #!/bin/bash for i in 1,3,4,6 ##有几个数就循环几次 do echo $i done for m in $( cat /root/num.log) ## /root/num ...

  8. 【linux】/etc/fstab修复

    /etc/fstab在修改后,如果配置错误直接重启的话会导致系统崩溃.建议大家重启前执行mount -a ,mount -a是自动挂载 /etc/fstab 里面的东西.若不慎重启了,会出现开机错误, ...

  9. Neutron Networking QoS

    目前,Neutron有一个QoS的proposal(https://wiki.openstack.org/wiki/Neutron/QoS#Documents),但是只有Ciscso和NVP插件实现了 ...

  10. Neutron分析(6)—— neutron-openvswitch-agent

    neutron-openvswitch-agent代码分析 neutron.plugins.openvswitch.agent.ovs_neutron_agent:main # init ovs fi ...