hdu1505 暴力或dp优化

本文介绍了三种方法解决矩阵中寻找最大连续F区域的问题:以宽度为主的方法通过暴力搜索实现,以高度为主的方法同样采用暴力搜索但节省了空间,而以高度或宽度为主的方法则通过动态规划优化搜索过程。每种方法都提供了详细代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
       给你一个矩阵,让你在里面找到一个最大的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;
}

      
   










      
         
      
   








       
      
      
      
 





CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值