[ABC233G] Strongest Takahashi
Problem Statement
There is a $N \times N$ grid, with blocks on some squares.
The grid is described by $N$ strings $S_1,S_2,\dots,S_N$, as follows.
- If the $j$-th character of $S_i$ is
#, there is a block on the square at the $i$-th row from the top and $j$-th column from the left. - If the $j$-th character of $S_i$ is
., there is not a block on the square at the $i$-th row from the top and $j$-th column from the left.
Takahashi can do the operation below zero or more times.
- First, choose an integer $D$ between $1$ and $N$ (inclusive), and a $D \times D$ subsquare within the grid.
- Then, consume $D$ stamina points to destroy all blocks within the subsquare.
Find the minimum number of stamina points needed to destroy all the blocks.
Constraints
- $N$ is an integer.
- $1 \le N \le 50$
- $S_i$ consists of
#and.. - $|S_i|=N$
Input
Input is given from Standard Input in the following format:
$N$
$S_1$
$S_2$
$\vdots$
$S_N$
Output
Print the answer as an integer.
Sample Input 1
5
##...
.##..
#.#..
.....
....#
Sample Output 1
4
By choosing the subsquares below, Takahashi will consume $4$ stamina points, which is optimal.
- The $3 \times 3$ subsquare whose top-left square is at the $1$-st row from the top and $1$-st column from the left.
- The $1 \times 1$ subsquare whose top-left square is at the $5$-th row from the top and $5$-th column from the left.
Sample Input 2
3
...
...
...
Sample Output 2
0
There may be no block on the grid.
Sample Input 3
21
.....................
.....................
...#.#...............
....#.............#..
...#.#...........#.#.
..................#..
.....................
.....................
.....................
..........#.....#....
......#..###.........
........#####..#.....
.......#######.......
.....#..#####........
.......#######.......
......#########......
.......#######..#....
......#########......
..#..###########.....
.........###.........
.........###.........
Sample Output 3
19
50的数据范围,基本上高次dp或者折半搜索的。这题不太像折半搜索,那就试一下高维dp。
定义 \(dp_{x1,y1,x2,y2}\) 为解决以 \((x1,y1)\) 为左上角,以 \((x2,y2)\) 为右下角矩形 所需的最小代价.
首先肯定有一种 \(\max(y2-y1+1,x2-x1+1)\) 的方案,那就是把他填满。
有一个引理,在我们填的矩阵中,一定不可能接壤,不然的话就可以选一个更大的矩阵,在代价一样的情况下框住的面积更大了。
所以如果不是全选的话,一定可以沿着某一行或者某一列把大矩阵割成两个矩阵解决。枚举对应的这一行或一列,递归下去就行了
这个dp的顺序应该按照区间dp的顺序。
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int n,dp[N][N][N][N],c1[N][N],c2[N][N],r1,r2;
char s[N][N];
void tomax(int&a,int b)
{
a=min(a,b);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c1[i][j]=c1[i][j-1]+(s[i][j]=='#');
c2[i][j]=c2[i-1][j]+(s[i][j]=='#');
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int l1=1;l1+i-1<=n;l1++)
{
for(int l2=1;l2+j-1<=n;l2++)
{
r1=l1+i-1,r2=l2+j-1;
dp[l1][l2][r1][r2]=max(i,j);
for(int k=l1;k<=r1;k++)
if(c1[k][r2]==c1[k][l2-1])
tomax(dp[l1][l2][r1][r2],dp[l1][l2][k-1][r2]+dp[k+1][l2][r1][r2]);
for(int k=l2;k<=r2;k++)
if(c2[l1-1][k]==c2[r1][k])
tomax(dp[l1][l2][r1][r2],dp[l1][l2][r1][k-1]+dp[l1][k+1][r1][r2]);
// printf("%d %d %d %d %d\n",l1,l2,r1,r2,dp[l1][l2][r1][r2]);
}
}
}
}
printf("%d",dp[1][1][n][n]);
}
[ABC233G] Strongest Takahashi的更多相关文章
- 酷摄影:关于梦 - Miki takahashi
这组摄影来自于日本东京摄影师 Miki takahashi 是一组双重曝光摄影,分开看也许很平常,但是结合在一起却非常有韵味. [gallery]
- 数据结构与算法实验题 4.2 Who is the strongest
数据结构与算法实验题 4.2 Who is the strongest ★实验任务 在神奇的魔法世界,召唤师召唤了一群的魁偶.这些魁偶排成一排,每个魁偶都有一个 战斗值.现在该召唤师有一个技能,该技能 ...
- AtCoder Beginner Contest 088 C Takahashi's Information
Problem Statement We have a 3×3 grid. A number ci,j is written in the square (i,j), where (i,j) deno ...
- AtCoder ABC 129F Takahashi's Basics in Education and Learning
题目链接:https://atcoder.jp/contests/abc129/tasks/abc129_f 题目大意 给定一个长度为 L ,首项为 A,公差为 B 的等差数列 S,将这 L 个数拼起 ...
- CF1574D The Strongest Build
考虑到有\(m\)个限制,可以考虑\(m+1\)个最大的答案,这样可以利用鸽笼原理得到答案. 这是一般做法. 但是这样的题目,我们发现\(n\)个操作都是独立的. 那么我们可以全部都选取最大,并以此调 ...
- 【LeetCode】1471. 数组中的 k 个最强值 The k Strongest Values in an Array (Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 自定义排序 日期 题目地址:https://leetc ...
- kafka源码分析之一server启动分析
0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...
- EasyPR--开发详解(8)文字定位
今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...
- Elixir - Hey, two great tastes that go great together!
这是Elixir的作者 José Valim 参与的一次技术访谈,很有料,我们可以了解Elixir的一些设计初衷,目标等等. 原文在: http://rubyrogues.com/114-rr-eli ...
- JMM(java内存模型)
What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more laye ...
随机推荐
- FastJson不成想还有个版本2啊:序列化大字符串报错
背景 发现陷入了一个怪圈,写文章的话,感觉只有大bug或比较值得写的内容才会写,每次一写就是几千字,争取写得透彻一些,但这样,我也挺费时间,读者也未必有这么多时间看. 我想着,日常遇到的小bug.平时 ...
- Programming abstractions in C阅读笔记:p127-p129
<Programming Abstractions In C>学习第51天,p127-p129,总结如下: 一.技术总结 1. string library 掌握常用函数如strlen,s ...
- 云服务器中Linux如何安装宝塔面板?
作者:西瓜程序猿 主页传送门:https://www.cnblogs.com/kimiliucn 官方使用手册:https://www.kancloud.cn/chudong/bt2017/42420 ...
- 关于关闭Sublime Text自动更新提示
Sublime Text默认提示自动更新,实在让人烦不胜烦,那么有没有办法解决嘞,那当然是有的,下面就教你如何关闭Sublime Text自动更新提示 首先注册,不注册的话,一切操作都没有用:(注册码 ...
- Blazor Server 发起HttpPost请求,但是多参数
一.介绍 今天突然想起之前工作上遇到的一个问题,在做Blazor 开发时后端给的一个接口请求方式是Post ,但是他需要携带多个参数,新建一个公共类又觉得麻烦,我就尝试着怎么在Post请求中携带多个参 ...
- 探索抽象同步队列 AQS
by emanjusaka from https://www.emanjusaka.top/archives/8 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址. 前言 AbstractQ ...
- vue框架,input相同标签如何定位-label定位
一.问题提出: 后台前端框架改版,之前是angularjs,现在用vue,导致input标签定位失败,只能定位到第一个input标签,查看后台源代码发现这两个标签是一模一样,如下图: 二.问题思考过程 ...
- 每天5分钟复习OpenStack(五)CPU虚拟化
KVM 虚拟化之CPU 虚拟化存在是为了更高效的利用物理机的资源,而虚拟机技术主要是针对三大组件,分别是CPU虚拟化.存储虚拟化.网络虚拟化.下面我们分别介绍下三大组件的常用知识. CPU 虚拟化 1 ...
- GPL协议原文及中文翻译
GPL协议原文及中文翻译 原文参考链接 翻译参考链接 原文 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 19 ...
- c#中适配器模式详解
基础介绍: 想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的. 想要实现要么就是改原有接口,但这样就违反了开闭原则,容 ...