HDU 2870 Largest Submatrix

本文解析了通过枚举+DP解决特定问题的方法,详细介绍了如何利用枚举a、b、c三个矩阵来求解最大子矩阵的问题,并给出了完整的代码实现。

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

这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版

如果按照上面由简到易的顺序来做的话,还是很简单的

这道题的思想就是 枚举+DP

因为某些字符可以变值,所以我们枚举a, b, c三个矩阵

分别求出对应的h数组以及最大子矩阵,再在里面求出一个最大值即可。

 

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int maxn = 1010;
 9 char map[maxn][maxn];
10 int h[3][maxn], l[3][maxn], r[3][maxn];
11 
12 int main(void)
13 {
14     #ifdef LOCAL
15         freopen("2870in.txt", "r", stdin);
16     #endif
17 
18     int row, col;
19     while(scanf("%d%d", &row, &col) == 2)
20     {
21         int i, j, k, t;
22         for(i = 0; i < row; ++i)
23             scanf("%s", map[i]);
24         memset(h, 0, sizeof(h));
25         int ans = 0;
26         for(i = 0; i < row; ++i)
27         {
28             for(j = 0; j < col; ++j)
29             {
30                 switch(map[i][j])
31                 {    //处理h数组
32                     case 'a':
33                         ++h[0][j], h[1][j] = h[2][j] = 0;
34                         break;
35                     case 'b':
36                         ++h[1][j], h[0][j] = h[2][j] = 0;
37                         break;
38                     case 'c':
39                         ++h[2][j], h[0][j] = h[1][j] = 0;
40                         break;
41                     case 'w':
42                         ++h[0][j], ++h[1][j], h[2][j] = 0;
43                         break;
44                     case 'x':
45                         ++h[1][j], ++h[2][j], h[0][j] = 0;
46                         break;
47                     case 'y':
48                         ++h[0][j], ++h[2][j], h[1][j] = 0;
49                         break;
50                     case 'z':
51                         ++h[0][j]; ++h[1][j], ++h[2][j];
52                 }
53             }
54             l[0][0] = l[1][0] = l[2][0] = 0;
55             r[0][col-1] = r[1][col-1] = r[2][col-1] = col-1;
56             for(j = 1; j < col; ++j)
57                 for(k = 0; k < 3; ++k)
58                 {
59                     t = j;
60                     while(t > 0 && h[k][j] <= h[k][t-1])
61                         t = l[k][t-1];
62                     l[k][j] = t;
63                 }
64 
65             for(j = col-2; j >= 0; --j)
66                 for(k = 0; k < 3; ++k)
67                 {
68                     t = j;
69                     while(t < col-1 && h[k][j] <= h[k][t+1])
70                         t = r[k][t+1];
71                     r[k][j] = t;
72                 }
73 
74             for(j = 0; j < col; ++j)
75                 for(k = 0; k < 3; ++k)
76                     ans = max(ans, (r[k][j]-l[k][j]+1)*h[k][j]);
77         }
78         printf("%d\n", ans);
79     }
80     return 0;
81 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3876819.html

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值