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. 使自定义事件支持多绑定 js

    <script language="JavaScript" type="text/javascript"> <!-- //定义类class1 ...

  2. paypal接口对接注意事项

    追加:新的设定画面 在paypal对接过程中,会存在return_url和notify两种 分别用pdt和ipn实现 但是对于paypal,大家请注意,真实环境和沙盒测试环境的区别 你可以到www.p ...

  3. 为App签名(为apk签名)

    为App签名(为apk签名) 原文地址 这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商 ...

  4. PhoneGap 在 Android 上的插件开发方法介绍

    移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...

  5. C# & SQL Server大数据量插入方式对比

    以下内容大部分来自: http://blog.csdn.net/tjvictor/article/details/4360030 部分内容出自互联网,实验结果为亲测. 最近自己开发一个向数据库中插入大 ...

  6. bzoj2152 聪聪可可

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  7. tespeed-测试网速的Python工具

    1.安装(环境CentOS7) #pip install lxml #wget wget http://sourceforge.net/projects/socksipy/files/socksipy ...

  8. Visual C++ for Linux Development

    原文  https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/ Visual C++ fo ...

  9. 如何添加WebService调用时的用户认证

    场景: 当把发布好的WebService地址或WSDL提供给调用方时,需要对方先进行身份的认证通过后才允许接口的进步访问.而不是公开的谁都可以调用. 解决: 1.在IIS中设置对应网站的目录访问权限. ...

  10. Apache日志不记录图片文件设置方法和来源日志的配置

    Apache日志不记录图片文件设置方法 <FilesMatch "\.(ico|gif|jpg|swf)">SetEnv IMAG 1</FilesMatch&g ...