CF2B The least round way(dp+记录路径)
2 seconds
64 megabytes
standard input
standard output
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.
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).
In the first line print the least number of trailing zeros. In the second line print the correspondent way itself.
3
1 2 3
4 5 6
7 8 9
0
DDRR
题意:给你一个n*n的矩阵 只能向下或者向右 问你从左上角走到左下角 你走过路径上数字的乘积尾部0个数最少的走法
思路:我们知道只有2和5的组合可以让尾部为0 所以我们可以预处理每个数字有多少个2和5 然后很容易得出方程dp[i][j][0/1]=min(dp[i-1][j][0/1],dp[i][j-1][0/1])+a[i][j][0/1]
值得注意的是 如果其中有出现0这个数字 那么就表示 只要经过这个点 那么尾部0的个数必然是1 那么答案就只能在0或者1中产生
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<time.h>
#include<queue>
#define ll long long int
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[]={,,,,,,,,,,,,};
int dir[][]={, ,, ,-, ,,-};
int dirs[][]={, ,, ,-, ,,-, -,- ,-, ,,- ,,};
const int inf=0x3f3f3f3f;
const ll mod=1e9+;
int dp[][][]; //0表示2的个数 1表示5的个数
int a[][]; //存矩阵
bool f=;
struct node{
int x;int y;
};
node path2[][]; //记录2的个数最少时的路径
node path1[][]; //记录5的个数最少时的路径
node ans[];
int cnt=;
void output1(node x){ //记录答案
if(x.x==&&x.y==) return ;
node t; t=path1[x.x][x.y];
output1(t);
ans[++cnt]=x;
}
void output2(node x){ //记录答案
if(x.x==&&x.y==) return ;
node t; t=path2[x.x][x.y];
output2(t);
ans[++cnt]=x;
}
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
int posx,posy;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
cin>>a[i][j];
int t=a[i][j];
if(t==){ //一但出现零我们需要标记一下
f=;
dp[i][j][]++;
dp[i][j][]++;
posx=i;
posy=j;
continue;
}
while(){ //统计2 和 5 的个数
if(t%==){
t/=;
dp[i][j][]++;
}else if(t%==){
t/=;
dp[i][j][]++;
}else{
break;
}
}
}
for(int i=;i<=n;i++){ // 预处理边界
dp[][i][]+=dp[][i-][];
dp[][i][]+=dp[][i-][];
node t; t.x=; t.y=i-;
path1[][i]=path2[][i]=t;
dp[i][][]+=dp[i-][][];
dp[i][][]+=dp[i-][][];
t.x=i-; t.y=;
path1[i][]=path2[i][]=t;
}
path1[][].x=path2[][].x=;
path1[][].y=path2[][].y=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){ //递推
if(dp[i-][j][]<dp[i][j-][]){
dp[i][j][]=dp[i-][j][]+dp[i][j][];
node temp; temp.x=i-; temp.y=j;
path1[i][j]=temp;
}else{
dp[i][j][]=dp[i][j-][]+dp[i][j][];
node temp; temp.x=i; temp.y=j-;
path1[i][j]=temp;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){ //递推
if(dp[i-][j][]<dp[i][j-][]){
dp[i][j][]=dp[i-][j][]+dp[i][j][];
node temp; temp.x=i-; temp.y=j;
path2[i][j]=temp;
}else{
dp[i][j][]=dp[i][j-][]+dp[i][j][];
node temp; temp.x=i; temp.y=j-;
path2[i][j]=temp;
}
}
int minn=min(dp[n][n][],dp[n][n][]);
if(minn>&&f){ //表示尾部零最小的个数就是1 那么我们就可以直接输出
cout<<""<<endl;
for(int i=;i<posx;i++)
cout<<"D";
for(int j=;j<posy;j++)
cout<<"R";
for(int i=posx;i<n;i++)
cout<<"D";
for(int j=posy;j<n;j++)
cout<<"R";
cout<<endl;
return ;
}
cout<<minn<<endl;
node e; e.x=n; e.y=n;
if(dp[n][n][]<dp[n][n][])
output1(e);
else{
output2(e);
}
for(int i=;i<=cnt;i++){
if(ans[i].x==ans[i-].x+)
cout<<"D";
else
cout<<"R";
}
cout<<endl;
return ;
}
CF2B The least round way(dp+记录路径)的更多相关文章
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)
E. Fire time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
- [CF2B] The least round way - dp
给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径: 以左上角为起点 每次只能向右或向下走 以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小"round" ...
- uva 10453 - Make Palindrome(dp, 记录路径)
题目 题意: 给一个字符串 ,判断最少插入多少个字符 使字符串成为回文串, 并输出回文串. 思路:先用dp判断需要个数, 再递归输出路径. #include <iostream> #inc ...
- codeforces 1272F dp+记录路径
题意 给出两个括号序列 \(S\) 和 \(T\),让你构造一个最短的合法括号序列使 \(S\) 和 \(T\) 是它的子序列. 分析 设 \(dp[i][j][k]\) 为这个最短的合法括号序列的前 ...
- POJ 题目1141 Brackets Sequence(区间DP记录路径)
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27793 Accepted: 788 ...
- POJ 2111 DP+记录路径
题意: 思路: 类似滑雪 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm& ...
- hdu1074 状压DP、栈实现记录路径
题意:给了几门学科作业.它们的截止提交期限(天数).它们的需要完成的时间(天数),每项作业在截止日期后每拖延一天扣一学分,算最少扣的学分和其完成顺序. 一开始做的时候,只是听说过状态压缩这个神奇的东西 ...
随机推荐
- Skywalking部署常见问题以及注意事项
Skywalking部署常见问题以及注意事项 Intro SkyWalking 创建与2015年,提供分布式追踪功能.从5.x开始,项目进化为一个完成功能的Application Performanc ...
- MySQL的自动提交模式
默认情况下, MySQL启用自动提交模式(变量autocommit为ON).这意味着, 只要你执行DML操作的语句,MySQL会立即隐式提交事务(Implicit Commit).这个跟SQL S ...
- Greenplum扩容
Greenplum支持原有主机扩展Segment个数.新增主机.和混合扩展 本文以在已有机器上扩展节点为例 1.可按照hostname:address:port:fselocation:dbid:co ...
- EF ORM
//新增 UserInfo userInfo = new UserInfo(); userInfo.UserName = "YANG"; userInfo.UserPass = & ...
- Scrapy案例01-爬取传智播客主页上的老师信息
目录 1. 新建scrapy项目 2. 爬虫文件: 2.1. 查看需要爬取内容存在哪里: 2.2. 设置item需要保存的数据变量 2.3. 创建爬虫文件 2.4. 保存数据 2.5. yield的用 ...
- Thirft简单使用
安装Thrift 到thrift官网下载thrift.exe http://thrift.apache.org/download 将thrift-0.10.0.exe复制到C:\Program Fil ...
- 并发框架Disruptor场景应用
今天用一个停车场问题来加深对Disruptor的理解.一个有关汽车进入停车场的问题.当汽车进入停车场时,系统首先会记录汽车信息.同时也会发送消息到其他系统处理相关业务,最后发送短信通知车主收费开始.看 ...
- Redis内存优化memory-optimization
https://redis.io/topics/memory-optimization 官方文档 一.特殊编码: 自从Redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化 ...
- linux安装成功后怎么调出终端
一.Ubuntu 桌面如下,点击搜索 二.输入terminal 终端 三.锁定到菜单栏 四.接下来就可以练习linux下的常用命令,如:ls mkdir cat touch 等等 这些命令后 ...
- 【Git】+ 新建+删除+上传+覆盖
上传代码时邮箱格式不符合:https://blog.csdn.net/u012558695/article/details/64921922 在本地新建一个分支: git branch newBran ...