[dp]Find Symmetries

题目描述
Snuke has two boards, each divided into a grid with N rows and N columns. For both of these boards, the square at the i-th row from the top and the j-th column from the left is called Square (i,j).
There is a lowercase English letter written in each square on the first board. The letter written in Square (i,j) is Si,j. On the second board, nothing is written yet.
Snuke will write letters on the second board, as follows:
First, choose two integers A and B ( 0≤A,B<N ).
Write one letter in each square on the second board. Specifically, write the letter written in Square (i+A,j+B) on the first board into Square (i,j) on the second board. Here, the k-th row is also represented as the (N+k)-th row, and the k-th column is also represented as the (N+k)-th column.
After this operation, the second board is called a good board when, for every i and j ( 1≤i,j≤N ), the letter in Square (i,j) and the letter in Square (j,i) are equal.
Find the number of the ways to choose integers A and B ( 0≤A,B<N ) such that the second board is a good board.

Constraints
1≤N≤300
Si,j ( 1≤i,j≤N ) is a lowercase English letter.

 

输入
Input is given from Standard Input in the following format:
N
S1,1S1,2..S1,N
S2,1S2,2..S2,N
:
SN,1SN,2..SN,N

 

输出
Print the number of the ways to choose integers A and B ( 0≤A,B<N ) such that the second board is a good board.

 

样例输入

复制样例数据

2
ab
ca
样例输出
2

 

提示

For each pair of A and B, the second board will look as shown below:
***
The second board is a good board when (A,B)=(0,1) or (A,B)=(1,0), thus the answer is 2.

扩展成(2n-1)*(2n-1),计算扩展后的正方形内有多少长度为n的子方形,dp[i][j]表示使以i,j为右下脚坐标的子方形呈对称的最大边长。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char Map[605][605];
int dp[605][605];
int n,A,B;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf(" %c",&Map[i][j]);
            Map[i+n][j]=Map[i][j+n]=Map[i+n][j+n]=Map[i][j];
        }
    }
    int ans=0;
    for(int i=1;i<=2*n-1;i++){
        for(int j=1;j<=2*n-1;j++){
            int cnt=0;
            for(int k=1;k<=min(i-1,j-1);k++){
                if(Map[i][j-k]==Map[i-k][j]) cnt++;
                else break;
            }
            dp[i][j]=1+min(dp[i-1][j-1],cnt);
            if(dp[i][j]>=n) ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}
View Code
 

转载于:https://www.cnblogs.com/lllxq/p/10592985.html

飞思卡尔智能车竞赛是一项备受关注的科技赛事,旨在激发学生的创新和实践能力,尤其是在嵌入式系统、自动控制和机器人技术等关键领域。其中的“电磁组”要求参赛队伍设计并搭建一辆能够自主导航的智能车,通过电磁感应线圈感知赛道路径。本压缩包文件提供了一套完整的电磁组智能车程序,这是一套经过实战验证的代码,曾在校级比赛中获得第二名的优异成绩。 该程序的核心内容可能涉及以下关键知识点: 传感器处理:文件名“4sensor”表明车辆配备了四个传感器,用于获取环境信息。这些传感器很可能是电磁感应传感器,用于探测赛道上的导电线圈。通过分析传感器信号的变化,车辆能够判断自身的行驶方向和位置。 数据采集与滤波:在实际运行中,传感器读数可能受到噪声干扰,因此需要进行数据滤波以提高精度。常见的滤波算法包括低通滤波、高斯滤波和滑动平均滤波等,以确保车辆对赛道的判断准确无误。 路径规划:车辆需要根据传感器输入实时规划行驶路径。这可能涉及PID(比例-积分-微分)控制、模糊逻辑控制或其他现代控制理论方法,从而确保车辆能够稳定且快速地沿赛道行驶。 电机控制:智能车的驱动通常依赖于直流电机或无刷电机,电机控制是关键环节。程序中可能包含电机速度和方向的调节算法,如PWM(脉宽调制)控制,以实现精准的运动控制。 嵌入式系统编程:飞思卡尔智能车的控制器可能基于飞思卡尔微处理器(例如MC9S12系列)。编程语言通常为C或C++,需要掌握微控制器的中断系统、定时器和串行通信等功能。 软件架构:智能车软件通常具有清晰的架构,包括任务调度、中断服务程序和主循环等。理解和优化这一架构对于提升整体性能至关重要。 调试与优化:程序能够在比赛中取得好成绩,说明经过了反复的调试和优化。这可能涉及代码效率提升、故障排查以及性能瓶颈的识别和解决。 团队协作与版本控制:在项目开发过程中,团队协作和版本控制工具(如Git)的应用不可或缺,能够保
双闭环直流电机调速系统是一种高效且应用广泛的直流调速技术。通过设置转速环和电流环两个闭环,系统能够对电机的转速和电流进行精准控制,从而提升动态响应能力和稳定性,广泛应用于工业自动化领域。 主电路设计:主电路采用三相全控桥整流电路,将交流电转换为可调节的直流电,为电机供电。晶闸管作为核心元件,通过调节控制角α实现输出电压的调节。 元部件设计:包括整流变压器、晶闸管、电抗器等元件的设计与参数计算,这些元件的性能直接影响系统的稳定性和效率。 保护电路:设计过载保护、短路保护等保护电路,确保系统安全运行。 驱动电路:设计触发电路和脉冲变压器,触发电路用于触发晶闸管导通,脉冲变压器用于传递触发信号。 控制器设计:系统核心为转速调节器(ASR)和电流调节器(ACR),分别对转速和电流进行调控。检测电路用于采集实际转速和电流值并反馈给调节器。 仿真分析:利用MATLAB/SIMULINK等工具对系统进行仿真分析,验证其稳定性和性能指标是否达标。 方案确定与框图绘制:明确系统构成及各模块连接方式。 主电路设计:选择整流电路形式,设计整流变压器、晶闸管等元部件并计算参数。 驱动电路设计:设计触发电路和脉冲变压器,确保晶闸管准确触发。 控制器设计: 转速调节器(ASR):根据转速指令调整实际转速。 电流调节器(ACR):根据ASR输出指令调整电流,实现快速响应。 参数计算:计算给定电压、调节器、检测电路、触发电路和稳压电路的参数。 仿真分析:通过软件模拟系统运行状态,评估性能。 电气原理图绘制:完成调速控制电路的电气原理图绘制。 双闭环控制策略:转速环在外,电流环在内,形成嵌套结构,提升动态响应能力。 晶闸管控制角调节:通过改变控制角α调节输出电压,实现转速平滑调节。 仿真分析:借助专业软件验证设计的合理性和有效性。 双闭环直流电机调速系统设计涉及主电路、驱动电路和控制器设计等多个环节,通过仿
《编译原理》是计算机科学中一门极为重要的课程,主要探讨如何将高级程序设计语言转换成机器可执行的指令。清华大学的张素琴教授在这一领域有着深厚的学术造诣,其编译原理课后习题答案对于学习者而言是非常珍贵的资源。这份压缩文件详细解析了课程中所涉及的概念、理论和方法的实践应用,目的是帮助学生更好地理解编译器设计的核心内容。 编译原理的核心知识点主要包括以下几点: 词法分析:作为编译过程的首要环节,词法分析器会扫描源代码,识别出一个个称为“标记”(Token)的最小语法单位。通常借助正则表达式来定义各种标记的模式。 语法分析:基于词法分析产生的标记流,语法分析器依据文法规则构建语法树。上下文无关文法(CFG)是编译器设计中常用的一种形式化工具。 语义分析:这一步骤用于理解程序的意义,确保程序符合语言的语义规则。语义分析可分为静态语义分析和动态语义分析,前者主要检查类型匹配、变量声明等内容,后者则关注运行时的行为。 中间代码生成:编译器通常会生成一种高级的中间表示,如三地址码或抽象语法树,以便于后续的优化和目标代码生成。 代码优化:通过消除冗余计算、改进数据布局等方式提升程序的执行效率,同时不改变程序的语义。 目标代码生成:根据中间代码生成特定机器架构的目标代码,这一阶段需要考虑指令集体系结构、寄存器分配、跳转优化等问题。 链接:将编译后的模块进行合并,解决外部引用,最终形成一个可执行文件。 错误处理:在词法分析、语法分析和语义分析过程中,编译器需要能够检测并报告错误,例如语法错误、类型错误等。 张素琴教授的课后习题答案覆盖了上述所有核心知识点,并可能包含实际编程练习,比如实现简单的编译器或解释器,以及针对特定问题的解题策略。通过解答这些习题,学生可以加深对编译原理的理解,提升解决问题的能力,为今后参与编译器开发或软件工程实践奠定坚实的基础。这份资源不仅是学习编译原理的有力辅助材料,也是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值