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. MySQL分库分表环境下全局ID生成方案 转

    在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...

  2. js中的各种宽高以及位置总结

    在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之 ...

  3. eclipse注解——作者,创建时间,版本

    总结: /** * @author liangyadong * @date ${date} ${time} * @version 1.0 */

  4. 111个知名Java项目集锦,包括url和描述

    转:http://www.cnblogs.com/wangs/p/3282183.html 项目名称   项目描述 ASM Java bytecode manipulation framework A ...

  5. php 连接测试sphinx

    shpinx.php <?php header("Content-type:text/html;charset=utf-8"); include 'SphinxClient. ...

  6. web api 500 错误

    改了API 方法内容后,就直接F5运行起来. 客户端用WebClient请求,老是返回500错误. 无意中重新编译了WEIAPI项目,客户端就正常了.

  7. sql数据库带补全终端命令

    mysql pip install mycli pgsql pip install pgcli 都是python脚本,记录备忘.

  8. windows下制作u盘启动的工具

    推荐rufus,快捷方便

  9. gcc和ld 中的参数 --whole-archive 和 --no-whole-archive

    首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串. --whole-ar ...

  10. Sublime Text 3 自定义配置快捷键

    Settings-User: { "font_face": "Courier New", "font_size": 14.0, " ...