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 ...
随机推荐
- apisix~升级原始插件的方法
扩展apisix原始插件 当apisix提供的插件不能满足我们要求时,我们可能需要将它的plugin进行个性化扩展,例如一个jwt认证插件jwt-auth,它本身具有验证jwt有效性功能,支持rs25 ...
- wpf 斗地主 单机版 没有机器人出牌算法
斗地主的游戏流程实现了,剩余的音效和机器人的出牌算法,抓地主算法就用最简单的实现. 主要实现了各种牌组的组合,牌组的大小比较,总共有16种牌组 基础牌组 单张.炸弹.炸弹型飞机带对子.炸弹型飞机什么都 ...
- Python爬取数据并保存到csv文件中
1.数据源 2.Python代码 import requests from lxml import etree import csv url = 'http://211.103.175.222:508 ...
- HTML——文本域
在 HTML 中,使用 <textarea> 标签来表示多行文本框,又叫做文本域.与其它 <input> 标签不同,<textarea> 标签是单闭合标签,它包含起 ...
- c#动态执行脚本的3种方式详解
1.使用Roslyn编译器 2.使用IronPython或IronRuby 3.使用JavaScript引擎 在C#中,可以使用一些第三方库或内置类库实现动态执行脚本的功能.以下是几个常用的方案: 1 ...
- wpf – 如何在UIElement.Margin上为绑定设置FallbackValue?
<Border BorderBrush="#cccccc" BorderThickness="1" Margin="{Binding PushM ...
- NumPy 泊松分布模拟与 Seaborn 可视化技巧
泊松分布 简介 泊松分布是一种离散概率分布,用于描述在给定时间间隔内随机事件发生的次数.它常用于模拟诸如客户到达商店.电话呼叫接入中心等事件. 参数 泊松分布用一个参数来定义: λ:事件发生的平均速率 ...
- FLV 分析脚本
一.需求 通过脚本,可以检查本地flv文件格式是否正确,可以打印每个Tag中的二进制内容 二.效果 可以看到VideoTag中开始处增加了一段SEI数据,并且可以看到部分字段,gameid.time. ...
- 使用Wesky.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)
使用前,需要对你的项目勾选输出api文档文件. 引用Wesky.Net.OpenTools包,保持1.0.11版本或以上. 为了方便,我直接在昨天的演示基础上,继续给实体类添加注释. 昨天的演示文 ...
- AnkhSVN For Visual Studio 2022
AnkhSVN For VS2022 AnkhSVN 2.9.87 - Visual Studio 2022 support https://github.com/AmpScm/AnkhSVN/rel ...