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 ...
随机推荐
- 【转】 CSS3阴影 box-shadow的使用和技巧总结
text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...
- Apache,PHP,MySQL,PMA手动配置的注意事项
注:本文之前发布在自己的QQ空间,复制过来的时候,颜色信息丢失了,回头有空再把颜色重新标上! 前言:LAMP(Linux+Apache+MySQL+PHP)环境是目前开源社区最活跃的开发和运行平台,有 ...
- js页面取值的三种方式
<input id=""<radio <checkbox<div<img对于这些标签内参数取值,一般分为三种类型:一.有关id取值用 #:取id处的v ...
- jsp中的内置对象(9个)、作用
jsp内置对象 定义:可以不加声明就在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量 JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): 1.request对象 客户 ...
- java将office文档pdf文档转换成swf文件在线预览
第一步,安装openoffice.org openoffice.org是一套sun的开源office办公套件,能在widows,linux,solaris等操作系统上执行. 主要模块有writer(文 ...
- 使用Servlet Filter做Login checking
1) 建一个Login Servlet: Login.java package com.my; import java.io.*; import javax.servlet.*; import jav ...
- 【jmeter】元件的作用域与执行顺序
1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(conf ...
- FTP主/被动模式的原理
---------------------------------------------------------------------------------------------------- ...
- poj1160 post office
题目大意:有n个乡村,现在要建立m个邮局,邮局只能建在乡村里.现在要使每个乡村到离它最近的邮局距离的总和尽量小,求这个最小距离和. n<300,p<30,乡村的位置不超过10000. 分析 ...
- powerdesigner12.5 设置表字符集和存储引擎
powerdesigner12.5在做建模的时候发现没有找到哪儿设置表的字符集和存储引擎.于是研究了一番. 在菜单上方选择 Database => Edit Current DBMS 然后选 ...