CF2B
非常恶心的dp题,测试数据也恶心,坑多,特别是0的坑
#include <iostream>
#include <utility>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
#define fi(i, a, b) for (int i = a; i <= b; ++i)
#define fr(i, a, b) for (int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int, int>;
//#define DEBUG
int s[1005][1005];
int dp[1005][1005][2];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
int flag = 0;
int fx, fy;
fi(i, 1, n) fi(j, 1, n)
{
cin >> s[i][j];
if (s[i][j] == 0)
{
if (!flag)
{
flag = 1;
fx = i;
fy = j;
}
continue;
}
while (s[i][j] % 2 == 0)
{
s[i][j] /= 2;
dp[i][j][0]++;
}
while (s[i][j] % 5 == 0)
{
s[i][j] /= 5;
dp[i][j][1]++;
}
}
fi(i, 1, n) fi(j, 1, n)
{
if (i == 1 && j == 1)
continue;
int p, q, r, ss, res1, res2;
p = q = r = ss = 0x3f3f3f3f;
if (s[i - 1][j] != 0)
{
p = dp[i][j][0] + dp[i - 1][j][0];
q = dp[i][j][1] + dp[i - 1][j][1];
}
if (s[i][j - 1] != 0)
{
r = dp[i][j][1] + dp[i][j - 1][1];
ss = dp[i][j][0] + dp[i][j - 1][0];
}
res1 = min(p, ss);
res2 = min(q, r);
if (res1 == 0x3f3f3f3f && res2 == 0x3f3f3f3f)
continue;
dp[i][j][0] = res1;
dp[i][j][1] = res2;
}
int count = 0;
// fi(i, 1, n) fi(j, 1, n)
// {
// count++;
// cout << dp[i][j][0] << " " << dp[i][j][1] << " " << count << endl;
// }
string ans = "";
int res = dp[n][n][0] > dp[n][n][1] ? 1 : 0;
int i = n, j = n;
while (1)
{
if (dp[i - 1][j][res] <= dp[i][j - 1][res])
{
if (s[i - 1][j] != 0)
{
i--;
ans += "D";
}
else if (s[i][j - 1] != 0)
{
j--;
ans += "R";
}
}
else if (dp[i - 1][j][res] >= dp[i][j - 1][res])
{
if (s[i][j - 1] != 0)
{
j--;
ans += "R";
}
else if (s[i - 1][j] != 0)
{
i--;
ans += "D";
}
}
if (s[i - 1][j] == 0 && s[i][j - 1] == 0)
break;
//走到第一行或第一列
if (i == 1)
{
for (int x = 1; x < j; x++)
ans += "R";
break;
}
if (j == 1)
{
for (int x = 1; x < i; x++)
ans += "D";
break;
}
}
reverse(ans.begin(), ans.end());
// fi(i, 1, n) fi(j, 1, n)
// {
// cout << dp[i][j][0] << " " << dp[i][j][1] << endl;
// }
if (ans.size() < 2 * n - 2)
{
cout << 1 << endl;
string temp = "";
fi(i, 1, fx - 1) temp += 'D';
fi(i, 1, fy - 1) temp += 'R';
fi(i, fx, n - 1)
{
temp += 'R';
}
fi(j, fy, n - 1)
{
temp += 'D';
}
cout << temp << endl;
return 0;
}
if (flag)
{
if (1 <= min(dp[n][n][0], dp[n][n][1]))
{
cout << 1 << endl;
string temp = "";
fi(i, 1, fx - 1) temp += 'D';
fi(i, 1, fy - 1) temp += 'R';
fi(i, fx, n - 1)
{
temp += 'R';
}
fi(j, fy, n - 1)
{
temp += 'D';
}
cout << temp << endl;
return 0;
}
else
{
cout << 0 << endl;
cout << ans << endl;
return 0;
}
}
else
{
cout << min(dp[n][n][0], dp[n][n][1]) << endl;
cout << ans << endl;
}
#ifdef DEBUG
//freopen(D:\in.txt,r,stdin);
#endif
return 0;
}
CF2B的更多相关文章
- CF2B The least round way(贪心+动规)
题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...
- 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 ...
- CF2B The least round way 题解
都是泪呀...↑ 题目传送门 题意(直接复制了QWQ) 题目描述 给定由非负整数组成的\(n \times n\)的正方形矩阵,你需要寻找一条路径: 以左上角为起点, 每次只能向右或向下走, 以右下角 ...
- CF2B The least round way
[题解] 可以发现10的因数除了1和10之外只有2和5了,那么走过的路径上各个数字的2的因数个数之和.5的因数个数之和中较小的一个即是答案.这样的话DP即可.同时需要注意有0的情况,有0的时候有一个答 ...
- [CF2B] The least round way - dp
给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径: 以左上角为起点 每次只能向右或向下走 以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小"round" ...
- C# 操作的时候接收用户输入密码进行确认
首先新建一个原始窗体,如下:
- dp入门30题
前言:本文章主要记录一些 \(dp\) 入门题,都是我做过的,希望读者能从这些基础题中打好 \(dp\) 扎实的基础,有不足的地方也欢迎指出.大部分是 \(CodeFoces\) 和 \(Atcode ...
随机推荐
- 🔥 Java Solon v2.7.6 发布
Java Solon 是什么框架? Java "新的"应用开发框架.开放原子开源基金会,孵化项目.从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态. 追求: 更 ...
- 10-flask博客项目
centos7 编译安装python3.7.1 安装步骤 centos7自带python2,由于执行yum需要python2,所以即使安装了python3也不能删除python21.安装依赖包yum ...
- HC32L110(六) AS06-VTB07H V5.0测试板AT指令固件
目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...
- 将外部jar打入本地maven仓库
1.将jar包放入某不含中文的路径下 ,例如:E:\file\zip4j-1.3.2.jar 2.在命令行输入操作命令 mvn install:install-file -DgroupId=zip4j ...
- VSCode配置JetBrains Mono字体
1. 下载JetBrains Mono字体 官网下载地址:https://www.jetbrains.com/lp/mono/ 2. 在VSCode配置字体 { "editor.fontFa ...
- Qt-FFmpeg开发-实现录屏功能(10)
音视频/FFmpeg #Qt Qt-FFmpeg开发-实现录屏功能 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-实现录屏功能 1.概述 2.实现效果 3.FFmpeg录屏代码流程️️ ...
- Qt(python) + 百度语音合成 实现demo
python实现 安装api sudo pip3 install baidu-aip 安装音频处理模块pydub sudo pip3 install pydub from aip import Aip ...
- C#开发的股票盯盘小工具——摸鱼助手,附源码
写了个盯盘小工具,最近发现很多炒股的小伙伴,上班期间看手机频繁是不是影响不好?电脑上打开交易软件,那影响是不是更不好?所以我就写了个小工具,给大家"摸鱼"用.虽然是摸鱼用,但是平常 ...
- C++笔记(8)常规new运算符和定位new运算符
通常,new负责在堆(heap)中找到一个能够满足要求的内存块.new运算符还有一种变体,被称为定位(placement)new运算符,他能让你能够指定要使用的位置.程序员可以使用这种特性来设置其内存 ...
- JavaSE什么是面向对象?
目录 重点!!!面向对象 面向过程与面向对象 面向过程的程序思想 面向对象程序思想 类和对象(面向对象的核心概念) 类: 类的结构 对象:(Everything is an object) 重点!!! ...