hdu1505 暴力或dp优化
题意:
给你一个矩阵,让你在里面找到一个最大的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优化相关推荐
- hdu2870暴力或者dp优化
题意: 给你一个矩阵,俩面的字母有一些转换规则,让你找到最大的相同字母字矩阵.. 思路: 一共有三种情况,就是a,b,c三种,我们可以分开来处理这三种情况,比如先处理a的,吧能转 ...
- Coins(多重背包方案可行性dp + 优化)
Coins 题目 给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. 思路 1.朴素的多重背包 题面给出的很明显的多重背包,定义dp为考虑前i种硬币,能凑出j元的方案可行性,可以得到第一版代码 ...
- hdu3585 二分最大团(dp优化)
题意 给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路: 求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...
- [DP优化之平行四边形不等式]例题
目录 概述 例题 Post Office 题目描述 解题思路 总结 Monkey Party 题目链接 解题思路 总结 评述 概述 首先说明一点,这种方法不是什么题都可以用的,我们要判断DP的情况,看 ...
- [BZOJ1499][NOI2005][DP+优化]瑰丽华尔兹
[Problem Description] 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大 ...
- C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )
链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...
- 简单暴力到dp的优化(入门篇)
上篇,我们提到,遇到问题,首先根据定义写出笨方法,找出依赖关系(有些题这一步就不太简单,要自己归纳关系),然后进行优化,下面,我们通过几道此方面的经典的,较为简单的二维题目进行讲解. 开始根据题来说明 ...
- 简单暴力到dp的优化(萌新篇)
想写一系列文章,总结一些题目,看看解决问题.优化方法的过程到底是什么样子的. 系列问题一:斐波那契数列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F( ...
- 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的方案数 然后暴力转 ...
最新文章
- ASFNU SC Day6
- java游戏一开始去山上打狐狸_。。。这才是Java的第一个程序------HelloWorld
- DISCUZ网站DIY后,导致DIY功能失效,无法在前台删除已创建的DIY功能解决办法
- 出远门需要检查的物件
- drupal启动过程
- c# 智能升级程序代码(1)
- maven依赖avro_Apache Avro使用入门指南
- 删除选修c语言课程的女生成绩记录,pta10-1 查询没有选修‘C语言‘课程的学生 (10分)...
- Smali动态调试方法
- php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
- mysql 数据库缓冲池_MySQL5.6新特性快速预热Buffer_Pool缓冲池
- C#进制转换(二进制转十进制 十进制转16进制等)
- 网页教程:为网站的Web Robot 设计路标
- wordpress 安装教程
- python中endswith函数什么意思_Python中endswith()函数的基本使用
- 【海思篇】【Hi3516DV300】六、音频输入篇
- Cadence OrCAD Capture 自底而上的设计流程
- iOS开发 学习计划图
- Vue上传文件 iview Upload UI 组件上传组件
- java jacob pdf_java-使用Jacob实现office转换成pdf