CF 。E2. Stars Drawing (Hard Edition) (DP)
Description:
定义一个星星由 '*' 组成,形状为一个对称的“十”字型,大小为星星 1/2 的横长(或纵长)减一(如题目中的图)。给出一个 n*m 的图,判断是不是每一个 '*' 都能属于某个星星,如果能则输出所有星星的位置及大小(各个星星间可以出现重叠甚至重合),否则输出-1.
Solution:
f[i][j][k] 代表在当前位置 (i, j) 在 k 方向有多少个连续的星号 '*'(1代表上,2代表下,3代表左,4代表右)。
枚举每一个星号(i, j),每一个星号上取 f[i][j][k](1 <= k <= 4) 中的最小值min,代表已当前位置为中心可形成的最大星星,当min > 1时代表当前星星合法。用vector记录下答案,扫一遍就可以找到所有星星。
同时用两个数组 presum_x 与 presum_y 表示当前星星的覆盖值,如果当前星星的位置为(i, j),大小为 d,那么将当前星星横向的左端点加一(presum_x[i-d+1][j]++),右端点加一的位置上减一(presum[i+d][j]--);同理,星星纵向的上端点加一(presum_y[i][j-d+1]++),下端点加一的位置上减一(presum_y[i][j+d]--)。
然后分别对这两个数组求横向和纵向的和,可以得出,所有找到的答案中的星星的覆盖值都大于0(妙啊)。所以,再进行一次扫描,如果当前位置为星号,且纵向和横向的覆盖值都为0,说明当前图中的所有星号不能被完全覆盖,输出-1,否则输出vector中记录下的答案。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int Mod = 1e9 + ;
const int MaxN = 1e5 + ; struct node {
int x, y, d;
}; char s[][];
int f[][][];
int presum_x[][], presum_y[][];
int n, m; void init() {
scanf("%d %d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%s", s[i] + );
for(int j = ; j <= m; j++) {
if(s[i][j] == '*') {
f[i][j][] = f[i-][j][] + ;
f[i][j][] = f[i][j-][] + ;
}
//else f[i][j][1] = f[i][j][3] = 0;
}
}
for(int i = n; i >= ; i--) {
for(int j = m; j >= ; j--) {
if(s[i][j] == '*') {
f[i][j][] = f[i+][j][] + ;
f[i][j][] = f[i][j+][] + ;
}
// else f[i][j][4] = f[i][j][2] = 0;
}
}
} vector <node> res; int main()
{
//Fio; init();
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
if(s[i][j] == '*') {
int d = min(min(f[i][j][], f[i][j][]), min(f[i][j][], f[i][j][]));
if(d > ) {
res.push_back((node){i, j, d-});
presum_x[i-d+][j]++; presum_x[i+d][j]--;
presum_y[i][j-d+]++; presum_y[i][j+d]--;
}
}
}
}
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
presum_x[i][j] += presum_x[i-][j];
presum_y[i][j] += presum_y[i][j-];
}
}
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
if(s[i][j] == '*' && presum_x[i][j] == && presum_y[i][j] == ) {
printf("-1\n");
return ;
}
}
}
printf("%d\n", res.size());
for(int i = ; i < res.size(); i++) printf("%d %d %d\n", res[i].x, res[i].y, res[i].d);
return ;
}
CF 。E2. Stars Drawing (Hard Edition) (DP)的更多相关文章
- 【CF】38E Let's Go Rolling! (dp)
前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以 ...
- 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)
题目 传送门:QWQ 分析 洛谷题解里有一位大佬讲的很好. 就是先用栈预处理出可以匹配的左右括号在数组中设为1 其他为0 最后求一下最长连续1的数量. 代码 #include <bits/std ...
- 【Codeforces】CF 2 B The least round way(dp)
题目 传送门:QWQ 分析 求结尾0的数量QwQ. 10只能是$ 2 \times 5 $,我们预处理出每个数因子中2和5的数量. 我们接着dp出从左上到右下的经过的最少的2的数量和最少的5的数量.两 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 由Leetcode详解算法 之 动态规划(DP)
因为最近一段时间接触了一些Leetcode上的题目,发现许多题目的解题思路相似,从中其实可以了解某类算法的一些应用场景. 这个随笔系列就是我尝试的分析总结,希望也能给大家一些启发. 动态规划的基本概念 ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
随机推荐
- leetcode骚题目列表
114,二叉树原地前序遍历转链表 令人不舒服的空间限制 4,O(logn)寻找两个数组的中位数 感觉诡异又很其妙的二分 279,判断一个数可拆成最少几个平方数的和 有O(n)解法,如果把sqrt视为O ...
- Linux桌面与命令行切换
1.首先在安装Linux的时候是选则Desktop桌面方式安装 2.切换命令 2.1快捷键:Ctrl+Alt+F1 切换到桌面模式 Ctrl+Alt+F3 切换到命令行模式
- JS-jQuery:百科
ylbtech-JS-jQuery:百科 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQu ...
- Install Apache 2.2.15, MySQL 5.5.34 & PHP 5.5.4 on RHEL/CentOS 6.4/5.9 & Fedora 19-12 [转]
Step 1: Installing Remi Repository ## Install Remi Repository on Fedora , , , , ## rpm -Uvh http://d ...
- 字符串模式匹配算法系列(三):Trie树及AC改进算法
Trie树的python实现(leetcode 208) #!/usr/bin/env python #-*- coding: utf-8 -*- import sys import pdb relo ...
- 实用maven笔记一概念&构建
maven,作为我现在每天都会使用的工具,却发现我还有很多地方了解的迷迷糊糊.老大就曾说过我的一个问题在于,做事情不够精细.大概就是太浮于表面吧.最近突然非常想把maven撸一遍.豆瓣搜了下高分书籍, ...
- [已解决]报错:xlrd.compdoc.CompDocError: Workbook: size exceeds expected 17920 bytes; corrupt?
报错代码如下: filePath='test.xls' data=pd.read_excel(filePath) print(data.head()) 报错内容如下: Traceback (most ...
- Java面试必问-ThreadLocal
前言 在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: “知道ThreadLocal吗?” “讲讲 ...
- redis的快速机制与数据类型
想一下 redis 的高并发和快速 单线程模型 - 避免了不必要的上下文切换和竞争条件(锁) Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Re ...
- c# 关于DataTable
1.DataRow数组 转DataTable using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=123;da ...