codeforces 2B The least round way 【DP】
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】的更多相关文章
- Codeforces 2B The least round way(dp求最小末尾0)
题目链接:http://codeforces.com/problemset/problem/2/B 题目大意: 给你一个nxn的矩形,找到一条从左上角到右下角的路径,使得该路径上所有数字的乘积的末尾0 ...
- 【非原创】codeforces - 1067A Array Without Local Maximums【dp】
学习博客:戳这里 附本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 co ...
- Codeforces 447 C DZY Loves Sequences【DP】
题意:给出一列数,在这个序列里面找到一个连续的严格上升的子串,现在可以任意修改序列里面的一个数,问得到的子串最长是多少 看的题解,自己没有想出来 假设修改的是a[i],那么有三种情况, 1.a[i]& ...
- [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】
[CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...
- 【dp】codeforces C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- python3多线程趣味详解
python3的多线程很多人无法理解是怎么运行的,因此本文从程序猿的日常生活出发,写了一个由浅入深的多线程教程,这样子大家就不会觉得陌生了,多线程真的很简单很简单! 不要讲多线程局限于库或者框架,自己 ...
- 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)
问题描述: 一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”.从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚.但是, ...
- (四)文本编辑器Vim/Vi
目录 前言 常用命令 扩展应用 总结 本系列先前的随笔位于新浪博客 前言 Vi和Vim都是文本编辑器,不同的是Vim是Vi的升级版本,它不仅兼容Vi的所有指令,而且还有一些新的特性在里面. Vim/V ...
- 使用CAJViewer 提取PDF文件中的文字
使用 CAJViewer 7.2 软件,把pdf格式的文件提取出文字. 操作步骤参考:http://jingyan.baidu.com/article/d45ad148cd06e469552b800f ...
- .git 目录文件介绍
$>tree -L 1.|-- HEAD # 这个git项目当前处在哪个分支里|-- config # 项目的配置信息,git config命令会改动它|-- des ...
- Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN
Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN.NET http://blog.csdn.net/borishuai/article/details ...
- 【shell】 for循环
#!/bin/bash for i in 1,3,4,6 ##有几个数就循环几次 do echo $i done for m in $( cat /root/num.log) ## /root/num ...
- 【linux】/etc/fstab修复
/etc/fstab在修改后,如果配置错误直接重启的话会导致系统崩溃.建议大家重启前执行mount -a ,mount -a是自动挂载 /etc/fstab 里面的东西.若不慎重启了,会出现开机错误, ...
- Neutron Networking QoS
目前,Neutron有一个QoS的proposal(https://wiki.openstack.org/wiki/Neutron/QoS#Documents),但是只有Ciscso和NVP插件实现了 ...
- Neutron分析(6)—— neutron-openvswitch-agent
neutron-openvswitch-agent代码分析 neutron.plugins.openvswitch.agent.ovs_neutron_agent:main # init ovs fi ...