题意:
       给你一个矩阵,让你在里面找到一个最大的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. Coins(多重背包方案可行性dp + 优化)

    Coins 题目 给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. 思路 1.朴素的多重背包 题面给出的很明显的多重背包,定义dp为考虑前i种硬币,能凑出j元的方案可行性,可以得到第一版代码 ...

  3. hdu3585 二分最大团(dp优化)

    题意       给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路:       求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...

  4. [DP优化之平行四边形不等式]例题

    目录 概述 例题 Post Office 题目描述 解题思路 总结 Monkey Party 题目链接 解题思路 总结 评述 概述 首先说明一点,这种方法不是什么题都可以用的,我们要判断DP的情况,看 ...

  5. [BZOJ1499][NOI2005][DP+优化]瑰丽华尔兹

    [Problem Description] 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大 ...

  6. C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )

    链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...

  7. 简单暴力到dp的优化(入门篇)

    上篇,我们提到,遇到问题,首先根据定义写出笨方法,找出依赖关系(有些题这一步就不太简单,要自己归纳关系),然后进行优化,下面,我们通过几道此方面的经典的,较为简单的二维题目进行讲解. 开始根据题来说明 ...

  8. 简单暴力到dp的优化(萌新篇)

    想写一系列文章,总结一些题目,看看解决问题.优化方法的过程到底是什么样子的. 系列问题一:斐波那契数列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F( ...

  9. CF14E Camels(暴力dp || 优化dp)

     洛谷链接: Camels - 洛谷 思路: 1.考虑暴力AC. 设f[i][j][k][a1][a2]为第i位,a[i]=j,a[i−1]=k,已经满足a1个要求1,a2个要求2的方案数 然后暴力转 ...

最新文章

  1. ASFNU SC Day6
  2. java游戏一开始去山上打狐狸_。。。这才是Java的第一个程序------HelloWorld
  3. DISCUZ网站DIY后,导致DIY功能失效,无法在前台删除已创建的DIY功能解决办法
  4. 出远门需要检查的物件
  5. drupal启动过程
  6. c# 智能升级程序代码(1)
  7. maven依赖avro_Apache Avro使用入门指南
  8. 删除选修c语言课程的女生成绩记录,pta10-1 查询没有选修‘C语言‘课程的学生 (10分)...
  9. Smali动态调试方法
  10. php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
  11. mysql 数据库缓冲池_MySQL5.6新特性快速预热Buffer_Pool缓冲池
  12. C#进制转换(二进制转十进制 十进制转16进制等)
  13. 网页教程:为网站的Web Robot 设计路标
  14. wordpress 安装教程
  15. python中endswith函数什么意思_Python中endswith()函数的基本使用
  16. 【海思篇】【Hi3516DV300】六、音频输入篇
  17. Cadence OrCAD Capture 自底而上的设计流程
  18. iOS开发 学习计划图
  19. Vue上传文件 iview Upload UI 组件上传组件
  20. java jacob pdf_java-使用Jacob实现office转换成pdf

热门文章

  1. 使用Ubuntu 12.04作为日常电脑环境
  2. android画笔画图(会持续更新完善,欢迎留言提问)
  3. js插件---webuploader 使用(lavarel中使用)
  4. LCD显示异常分析——开机闪现花屏【转】
  5. jedate-开始使用一款好用的时间插件
  6. mysql 自定义提示符
  7. chrome表单自动填充去掉input黄色背景
  8. 刷题向》关于一道比较优秀的递推型DP(openjudge9275)(EASY+)
  9. asp.net如何读取Excel文件
  10. Chrome插件(Extensions)开发实践