题意:

       给你一个矩阵,让你在里面找到一个最大的f矩阵..

思路:

      三种方法ac这到题目;

 方法(1) 以宽为主,暴力

   开一个数组sum[i][j],记录当前这个位置的前面有多少个连续的f,更新完这个数组时候在枚举每一个点,只处理最后一列或者sum[i][j+1] =0 的点,因为只有这样的点才可能是最大的,对于每一个要处理的点,直接往上跑和往下跑,跑的条件是sum[i][j] <= sum[k][j]

(k是上跑或下跑的数),然后找到一共跑了多少个,当前的最大就是 sum[i][j] * cnt(次数);

  

 方法(2) 以高为主,暴力

   开一个数组sum[j],记录第j列的前面有多少个连续的'F',其实跟方法1差不多,只不过是节省了空间,而且非常好写,只要把方法一的矩阵旋转一下就写法一样了,不多说...

 方法(3) 以高或宽为主,dp

 无论是方法一还是方法二,过程中都会有这么一步就是对于当前的点,我们要找到它左边有多少个f有边有多少个f,对于找f的这个环节我们可以dp实现,开两个数组L[],R[],L[i]代表i的左边f连续到那个下标,R[i]便是i的有边的f连续到那个下标,这样就可以O(n)的时间吧所有的都找到,然后枚举找最大就行了,汉字不太好解释,直接看代码就懂了..

找宽(1)


#include<stdio.h>
#include<string.h> #define N 1000 + 10

int
map[N][N];
int
sum[N][N]; char str[10]; int main ()
{
int
t ,i ,j ,n ,m;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= m ;j ++)
{

scanf("%s" ,str);
if(
str[0] == 'F') map[i][j] = 1;
else
map[i][j] = 0;
} for(
i = 1 ;i <= n ;i ++)
{

sum[i][1] = map[i][1];
for(
j = 2 ;j <= m ;j ++)
{
if(
map[i][j]) sum[i][j] = sum[i][j-1] + 1;
else
sum[i][j] = 0;
}
} int
ans = 0;
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= m ;j ++)
{
if(
sum[i][j] > 0 && (j == m || !sum[i][j+1]))
{
int
ss = sum[i][j];
for(int
k = i - 1 ;k >= 1 ;k --)
{
if(
sum[k][j] < sum[i][j]) break;
ss += sum[i][j];
}
for(int
k = i + 1 ;k <= n ;k ++)
{
if(
sum[k][j] < sum[i][j]) break;
ss += sum[i][j];
}
if(
ans < ss) ans = ss;
}
}

printf("%d\n" ,ans * 3);
}
return
0;
}

找高(2)

#include<stdio.h>
#include<string.h> #define N 1000 + 100

int
sum[N];
char
map[N][N];
char
str[10]; int main ()
{
int
n ,m, i ,j ,t;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= m ;j ++)
{

scanf("%s" ,str);
map[i][j] = str[0];
}
memset(sum ,0 ,sizeof(sum));
int
ans = 0;
for(
i = 1 ;i <= n ;i ++)
{
for(
j = 1 ;j <= m ;j ++)
if(
map[i][j] == 'F') sum[j]++;
else
sum[j] = 0; for(j = 1 ;j <= m ;j ++)
{
if(!
sum[j]) continue;
int
ss = sum[j];
for(int
k = 1 ;j + k <= m && sum[j+k] >= sum[j] ;k ++)
ss += sum[j];
for(int
k = 1 ;j - k >= 1 && sum[j-k] >= sum[j] ;k ++)
ss += sum[j];
if(
ss > ans) ans = ss;
}
}

printf("%d\n" ,ans * 3);
}
return
0;
}

找高(dp优化)(3)

#include<stdio.h>
#include<string.h> #define N 1000 + 100

int
sum[N];
int
L[N] ,R[N];
char
map[N][N];
char
str[10]; int main ()
{
int
n ,m, i ,j ,t;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= m ;j ++)
{

scanf("%s" ,str);
map[i][j] = str[0];
}
memset(sum ,0 ,sizeof(sum));
int
ans = 0;
for(
i = 1 ;i <= n ;i ++)
{
for(
j = 1 ;j <= m ;j ++)
if(
map[i][j] == 'F') sum[j]++;
else
sum[j] = 0; L[1] = 1 ,R[m] = m;
for(
j = 2 ;j <= m ;j ++)
{
int
k = j;
while(
k > 1 && sum[j] <= sum[k-1]) k = L[k-1];
L[j] = k;
}
for(
j = m - 1 ;j >= 1 ;j --)
{
int
k = j;
while(
k < m && sum[j] <= sum[k+1]) k = R[k+1];
R[j] = k;
}
for(
j = 1 ;j <= m ; j++)
{
int
now = (R[j] - L[j] + 1) * sum[j];
if(
ans < now) ans = now;
}
/*
for(j = 1 ;j <= m ;j ++)
{
if(!sum[j]) continue;
int ss = sum[j];
for(int k = 1 ;j + k <= m && sum[j+k] >= sum[j] ;k ++)
ss += sum[j];
for(int k = 1 ;j - k >= 1 && sum[j-k] >= sum[j] ;k ++)
ss += sum[j];
if(ss > ans) ans = ss;
}
*/
}

printf("%d\n" ,ans * 3);
}
return
0;
}

hdu1505 暴力或dp优化的更多相关文章

  1. hdu2870暴力或者dp优化

    题意:       给你一个矩阵,俩面的字母有一些转换规则,让你找到最大的相同字母字矩阵.. 思路:      一共有三种情况,就是a,b,c三种,我们可以分开来处理这三种情况,比如先处理a的,吧能转 ...

  2. 取数字(dp优化)

    取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le ...

  3. 【学习笔记】动态规划—各种 DP 优化

    [学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成 ...

  4. [总结]一些 DP 优化方法

    目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单 ...

  5. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  6. NOIP2015 子串 (DP+优化)

    子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...

  7. LCIS tyvj1071 DP优化

    思路: f[i][j]表示n1串第i个与n2串第j个且以j结尾的LCIS长度. 很好想的一个DP. 然后难点是优化.这道题也算是用到了DP优化的一个经典类型吧. 可以这样说,这类DP优化的起因是发现重 ...

  8. dp优化1——sgq(单调队列)

    该文是对dp的提高(并非是dp入门,dp入门者请先参考其他文章) 有时候dp的复杂度也有点大...会被卡. 这几次blog大多数会讲dp优化. 回归noip2017PJT4.(题目可以自己去百度).就 ...

  9. loj6171/bzoj4899 记忆的轮廊(期望dp+优化)

    题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...

随机推荐

  1. 基于Hi3559AV100 RFCN实现细节解析-(2)RFCN数据流分析

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...

  2. OpenGL导出渲染的图像到外部文件中

    需要配置Freeimage库 首先下载好FreeImage 找打dist目录下的x32目录,将.h文件放在包含目录下:将lib文件放在库目录下,将dll放在运行目录下 保存渲染结果到png格式的图像: ...

  3. 【linux】Linux删除文件后磁盘依旧占用空间的问题

    转自https://blog.51cto.com/2483526/798379 感谢 1.用df 检查发现/根目录可用空间为0 [root@/]#df -h 2.用du检查发现各目录占用的空间都很少, ...

  4. WorkSkill整理之 java用Scanner 类输入数组并打印

    输入不确定长度的数组 import java.util.*; public static void main(String[] args){ System.out.println("请输入一 ...

  5. 2019 GDUT Rating Contest II : Problem G. Snow Boots

    题面: G. Snow Boots Input file: standard input Output file: standard output Time limit: 1 second Memory ...

  6. 一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解

    更多linux知识,请关注公众号:一口Linux 一.脚本 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. #!/bin/bash # 获取要监控的本地服务器IP ...

  7. Vue ElementUI表格table中使用select下拉框组件时获取改变之前的值

    目前项目中有一个场景,就是表格中显示下拉框,并且下拉框的值可以更改,更改后提交后台更新.因为这个操作比较重要,所以切换时会有一个提示框,提示用户是否修改,是则走提交逻辑,否则直接返回,什么也不做. 之 ...

  8. 攻防世界 reverse BabyXor

    BabyXor     2019_UNCTF 查壳 脱壳 dump 脱壳后 IDA静态分析 int main_0() { void *v0; // eax int v1; // ST5C_4 char ...

  9. 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  10. 面试题:ApplicationContext和BeanFactory两种容器区别

    ApplicationContext和BeanFactory两种容器区别 BeanFactory是ApplicationContext容器的父接口 BeanFactory(多例模式): BeanFac ...