CodeForces - 570E - Pig and Palindromes dp

本文介绍了一种利用动态规划算法解决寻找地图上回文串路径数量的问题。通过从起点和终点同时进行搜索,并使用滚动数组优化内存占用,最终实现高效计算。

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

题目链接

题意:给定一个 n ∗ m n*m nm 的地图,地图上每个格子有一个小写的英文字母,起点为 ( 1 , 1 ) (1,1) (11) ,终点为 ( n , m ) (n,m) (nm) ,且每一步的移动只能往右移一格或者往下移一格。求所有从起点到终点的路径,经过的格子按顺序能组成回文串的路径个数。

思路:由于回文串的对称性,可以考虑同时从起点和终点出发,一个往右或下移动,一个往左或上移动。这样状态则为 ( x 1 , y 1 , x 2 , y 2 ) (x1,y1,x2,y2) (x1y1x2y2) ,但是这样会超出内存限制。
由于是同时移动,所以两个点经过的步数相同,而已知步数和横坐标,就可以求出纵坐标,所以把状态进一步化简得 ( s t e p , x 1 , x 2 ) (step,x1,x2) (stepx1x2) ,但是这样还是会超出内存限制,所以就用滚动数组去掉 s t e p step step 这一维即可,之后便是一般的 d p dp dp 过程。

#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
const int mod = 1e9 + 7;
int n, m;
char a[505][505] = {};
int dp[2][505][505] = {};//表示当前某个状态的方法数
inline void AC()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        getchar();
        for (int j = 1; j <= m; ++j)
            a[i][j] = getchar();
    }
    if (a[1][1] != a[n][m])
    {
        printf("0");
        return;
    }
    dp[1][1][n] = 1;
    for (int step = 2; step * 2 <= n + m - 1; ++step)
    {
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                dp[step % 2][i][j] = 0;
        for (int x1 = 1; x1 <= step && x1 <= n; ++x1)
        {
            int y1 = step - x1 + 1;
            if (y1 < 1 || y1 > m)
                continue;
            for (int x2 = 1; x2 <= step && x2 <= n; ++x2)
            {
                int y2 = step - x2 + 1;
                x2 = n - x2 + 1;
                y2 = m - y2 + 1;
                if (y2 < 1 || y2 > m || a[x1][y1] != a[x2][y2])
                {
                    x2 = n + 1 - x2;
                    continue;
                }
                (dp[step % 2][x1][x2] += dp[1 - step % 2][x1 - 1][x2]) %= mod;
                (dp[step % 2][x1][x2] += dp[1 - step % 2][x1 - 1][x2 + 1]) %= mod;
                (dp[step % 2][x1][x2] += dp[1 - step % 2][x1][x2 + 1]) %= mod;
                (dp[step % 2][x1][x2] += dp[1 - step % 2][x1][x2]) %= mod;
                //printf("step:%d [%d,%d] [%d,%d]\n", step, x1, y1, x2, y2);
                x2 = n + 1 - x2;
            }
        }
    }
    int ans = 0;
    int step = (n + m - 1) >> 1;
    if ((n + m - 1) & 1)
    {
        for (int x = 1; x <= n; ++x)
        {
            (ans += dp[step % 2][x][x + 1]) %= mod;
            (ans += dp[step % 2][x - 1][x + 1]) %= mod;
            (ans += dp[step % 2][x - 1][x]) %= mod;
            (ans += dp[step % 2][x][x]) %= mod;
        }
        printf("%d\n", ans);
        return;
    }
    for (int x1 = 1; x1 <= step; ++x1)
    {
        int y1 = step - x1 + 1;
        if (y1 < 1 || y1 > m)
            continue;
        for (int x2 = 1; x2 <= step; ++x2)
        {
            int y2 = step - x2 + 1;
            x2 = n - x2 + 1;
            y2 = m - y2 + 1;
            if (y2 < 1 || y2 > m || !((x1 == x2 && y2 == y1 + 1) || (y1 == y2 && x2 == x1 + 1)))
            {
                x2 = n + 1 - x2;
                continue;
            }
            (ans += dp[step % 2][x1][x2]) %= mod;
            x2 = n + 1 - x2;
        }
    }
    printf("%d\n", ans);
}
int main()
{
    AC();
    return 0;
}
内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值