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 ...
随机推荐
- 让AnaTraf成为您网络流量分析的最佳利器
在快速发展的数字时代,企业对网络性能的监测与分析需求愈加旺盛.作为网络性能监测与诊断(NPMD)领域的佼佼者,AnaTraf网络流量分析仪凭借其出色的性能和易用性,正成为网络管理人员的首选工具. An ...
- Linux上执行内存中的脚本和程序
在Linux中可以不需要有脚本或者二进制程序的文件在文件系统上实际存在,只需要有对应的数据在内存中,就有办法执行这些脚本和程序. 原理其实很简单,Linux里有办法把某块内存映射成文件描述符,对于每一 ...
- java基础 韩顺平老师的 异常 自己记的部分笔记
443,异常处理入门 package com.hspedu.exception_; public class Exception { public static void main(String[] ...
- WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)
在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None".AllowsTransparency="True" 这两个 ...
- uniapp 跳转指定的tab导航页面
考察的知识点:1.uniapp的页面跳转方法:uni.navigateTo2.页面跳转传值的方法:'?名称=值' 的方式3.参数的接收 onload(option){} 第一个页面的写法: toCom ...
- map数据类型
MAP数据类型是一个类似于对象的数据类型 大型项目中会经常使用 通过 构造函数来定义MAP数据类型 con ...
- AWS Ubuntu22.04安装Mysql及配置远程连接、SCP上传文件
一.升级apt资源包 sudo apt update 二.安装MySQL sudo apt install mysql-server 三.启动MySQL服务 sudo service mysql st ...
- Linux curl支持http/https方法,Curl请求示例语法
Curl请求示例curl -X GET "http://<host:port>/api/1/test/get?test=<value>&app_id=< ...
- Bind DNS服务——带KEY的区域传送与子域授权
Linux基础服务--Bind DNS服务 Part3 带KEY的区域传送与子域授权 带KEY的区域传送 上文提到了区域传送,但实际上在区域传送的时,传送的区域文件并不会被加密.因此一般的区域传送并不 ...
- 06-Linux用户和组管理
关于用户和组的知识 家目录 用户都有家目录:root用户家目录为/root.其他用户的家目录在/home/,如user1的家目录为/home/user1 当我们创建用户时,系统就会自动创建该用户的家目 ...