Codeforces2B - The least round way(DP)
题目大意
给定一个N*N的格子,每个格子里有一个非负数,要求你找出从左上角到右下角的一条路径,使得它满足路径上的格子里的数全部乘起来的积尾部0最少
题解
如果要产生0肯定是2*5得出来的,最终的乘积可以表示为2^x*5^y*C,那么零的个数就是min(x,y)。我们可以先对每个格子里的数预处理下,计算出2和5的个数来,然后DP分别求出2和5的最小个数然后选两者中的最小值,输出路径方法没啥说的,很传统~~还有一个要注意的问题就是如果某个格子的数字为0的情况,这个需要特殊判断一下,我们可以把它当做10,如果最后的结果0的个数大于1则直接输出尾部0的个数为1即可
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <utility>
using namespace std;
#define MAXN 1005
#define INF 0x7fffffff
int path[MAXN][MAXN][2];
int dp[MAXN][MAXN][2],a[MAXN][MAXN][2],n;
int zerox,zeroy,x;
string s;
bool flag;
int main()
{
scanf("%d",&n);
flag=false;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&x);
if(!x)
{
a[i][j][0]=a[i][j][1]=1;
zerox=i,zeroy=j,flag=true;
}
else
{
while(x%2==0) {a[i][j][0]++;x/=2;}
while(x%5==0) {a[i][j][1]++,x/=5;}
}
}
for(int k=0;k<2;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
int ans=INF;
if(i==0&&j==0) ans=0;
if(i!=0&&dp[i-1][j][k]<ans) ans=dp[i-1][j][k];
if(j!=0&&dp[i][j-1][k]<ans) ans=dp[i][j-1][k],path[i][j][k]=1;
dp[i][j][k]=ans+a[i][j][k];
}
int k=dp[n-1][n-1][0]<dp[n-1][n-1][1]?0:1;
if(flag&&dp[n-1][n-1][k]>1)
{
for(int i=0;i<zeroy;i++)
s+="R";
for(int i=0;i<zerox;i++)
s+="D";
for(int i=0;i<n-zeroy-1;i++)
s+="R";
for(int i=0;i<n-zerox-1;i++)
s+="D";
cout<<1<<endl<<s<<endl;
}
else
{
int i=n-1,j=n-1;
while(i>0||j>0)
{
if(path[i][j][k]==1)
s+="R",j--;
else
s+="D",i--;
}
reverse(s.begin(),s.end());
cout<<dp[n-1][n-1][k]<<endl<<s<<endl;
}
return 0;
}
Codeforces2B - The least round way(DP)的更多相关文章
- CF2B The least round way(dp+记录路径)
B. The least round way time limit per test 2 seconds memory limit per test 64 megabytes input standa ...
- codeforces 2B The least round way(DP+数学)
The least round way 题目链接:http://codeforces.com/contest/2/problem/B ——每天在线,欢迎留言谈论.PS.本题有什么想法.建议.疑问 欢迎 ...
- Codeforces Beta Round #2 B. The least round way dp
B. The least round way 题目连接: http://www.codeforces.com/contest/2/problem/B Description There is a sq ...
- Codeforces #2B The least round way(DP)
Description 有一个n*n的正整数矩阵,要你求一条从第一行第一列的格子到第n行第n列的路,使得你走过的格子里面的数乘起来的值末尾的零的个数最小.输出最小个数. Input 第一行包括1个数n ...
- [CF2B] The least round way - dp
给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径: 以左上角为起点 每次只能向右或向下走 以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小"round" ...
- Codeforces Beta Round #2B(dp+数学)
贡献了一列WA.. 数学很神奇啊 这个题的关键是怎么才能算尾0的个数 只能相乘 可以想一下所有一位数相乘 除0之外,只有2和5相乘才能得到0 当然那些本身带0的多位数 里面肯定含有多少尾0 就含有多少 ...
- CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
C - Circling Round Treasures 题意: 在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹.你从(sx,sy)出发,走四连通的格子.你需要走一条闭合的路径,可以自交 ...
- CF 2B The least round way DP+Math
题意: 找出一条路, 使每个节点相乘,得到的数末尾 0 最少 每次移动只能向右或者向下, 找到后打印路径 ///按照题目要求,就是找出一条从左上角到右下角中每个数含2 or 5 最少的路 ///可以用 ...
- Codeforces 837D - Round Subset DP
先算出每个数的pop1(twonum),pop(fivenum)然后DP ans[i][j]表示选i个数有j个2时最多有多少个5 转移方程是 ;j--) { ;w++) { ans[j][w]=max ...
随机推荐
- stream的Read、Write方法实例
, bytes.Length)) > ) , readBytes-);//8为偏移量,10为数量 } } ...
- CODEVS 1638 修复公路
题目描述 Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄, ...
- add a path cgi-bin to asp.net mvc
1.简单,但是会丢失请求数据 protected void Application_BeginRequest() { string url = HttpContext.Current.Request. ...
- C++练习题
1. 用面向对象的程序描述员工拥有的股票,股票有公司,价格,数量属性,且拥有展现基本数据,更新价格,买进,卖出操作,并具有比较两个股票对象股值大小的比较方法. 2. 用面向对象的程序描述一个栈的操作, ...
- jQuery name checked 模糊查找匹配ID
("div[name='jobTitle']") $("#aDiv").find("input[type='checkbox']:checked&qu ...
- sql 锁相关(转)
锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库 ...
- 实战中总结出来的CSS常见问题及解决办法
一.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值. 二.同一个的class选择符可以在一个文档中重复出现,而id选择符却只能出现一次.对 一个标签同时使用cla ...
- web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践 经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无 从 ...
- C#导入导出数据到Excel的通用类代码
Excel文件导入导出,需引用Microsoft Excel 11.0 Object Library ///////////////////////////////////////////////// ...
- 云告警平台 OneAlert :如何帮助运维工程师做好汇报?
OneAlert 是北京蓝海讯通科技有限公司旗下产品,中国首个 SaaS 模式的云告警平台,可集成 Zabbix ,Nagios ,Solarwinds ,AWS CloudWatch ,阿里云 ,监 ...