UVA 11404 Plalidromic Subsquence (回文子序列,LCS)

本文介绍了一种求解字符串中最长回文子序列的方法,通过动态规划算法结合比较函数来实现,确保找到的回文子序列不仅是最长的,而且在字典序上是最小的。

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

最长回文子序列可以用求解原串s和反转串rv的LCS来得到,因为要求回文串分奇偶,dp[i][j]保存长度,

要求字典序最小,dp[i][j]应该表示回文子序列的端点,所以边界为单个字符,即i+j=len+1。

这题最麻烦的地方在于字典序,我是写了个比较函数,有点暴力(常数大)。

也可以反着定义,这时结点就要保存那个状态的字符串了(这样定义比较字典序的时候常数小)

#include<bits/stdc++.h>
using namespace std;

#define MP make_pair
#define fi first
#define se second

const int LEN = 1e3+5;
char s[LEN],rv[LEN];
int dp[LEN][LEN];
pair<int,int> pre[LEN][LEN];
char val[LEN][LEN];

inline void updata(int i,int j,int v,char c,const pair<int,int> &prv)
{
    dp[i][j] = v;
    pre[i][j] = prv;
    val[i][j] = c;
}

const auto nil = MP(0,0);

#define dim(x) [x.fi][x.se]
bool cmpLex(pair<int,int> a,pair<int,int> b)
{
    //
    while(a != nil && val[a.fi][a.se] == val[b.fi][b.se]){
        a = pre dim(a); b = pre dim(b);
    }
    return val dim(a) < val dim(b);
}

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif

    while(gets(s)){
        int len = strlen(s);
        for(int i = 0; i < len; i++){
            rv[len-1-i] = s[i];
        }
        int hd1,hd2,vl = 0;
        for(int i = 1; i <= len; i++){
            int j = len+1-i;
            dp[i][j] = 1; val[i][j] = s[i-1]; pre[i][j] = nil;
            if(dp[i][j] > vl || ( dp[i][j] == vl && cmpLex( MP(i,j), MP(hd1,hd2) ) ) ){//
                vl = dp[i][j];
                hd1 = i; hd2 = j;
            }
            for(int k = 1; k < j; k++) dp[i][k] = 0;
            for(j++; j <= len; j++){
                if(s[i-1] == rv[j-1]){
                    updata(i,j,dp[i-1][j-1]+2,s[i-1],make_pair(i-1,j-1));
                    if(dp[i][j] > vl || (dp[i][j] == vl && cmpLex(MP(i,j),MP(hd1,hd2)) ) ){//
                        vl = dp[i][j];
                        hd1 = i; hd2 = j;
                    }
                }else {
                    if(dp[i-1][j] > dp[i][j-1] || (dp[i-1][j] == dp[i][j-1] && cmpLex(MP(i-1,j),MP(i,j-1)) ) ){//
                        updata(i,j,dp[i-1][j],val[i-1][j],pre[i-1][j]);
                    }else {
                        updata(i,j,dp[i][j-1],val[i][j-1],pre[i][j-1]);
                    }
                }

            }
        }
        int pv = (vl+1)>>1,ln = vl;

        auto u = MP(hd1,hd2);
        for(int i = 0; i < pv; i++){
            s[i] = val[u.fi][u.se];
            u = pre[u.fi][u.se];
        }

        s[ln] = '\0';
        for(int i = pv; i < ln; i++){
            s[i] = s[ln-1-i];
        }
        puts(s);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/jerryRey/p/4851673.html

内容概要:本文深入探讨了金属氢化物(MH)储氢系统在燃料电池汽车中的应用,通过建立吸收/释放氢气的动态模型和热交换模型,结合实验测试分析了不同反应条件下的性能表现。研究表明,低温环境有利于氢气吸收,高温则促进氢气释放;提高氢气流速和降低储氢材料体积分数能提升系统效率。论文还详细介绍了换热系统结构、动态性能数学模型、吸放氢特性仿真分析、热交换系统优化设计、系统控制策略优化以及工程验证与误差分析。此外,通过三维动态建模、换热结构对比分析、系统级性能优化等手段,进一步验证了金属氢化物储氢系统的关键性能特征,并提出了具体的优化设计方案。 适用人群:从事氢能技术研发的科研人员、工程师及相关领域的研究生。 使用场景及目标:①为储氢罐热管理设计提供理论依据;②推动车载储氢技术的发展;③为金属氢化物储氢系统的工程应用提供量化依据;④优化储氢系统的操作参数和结构设计。 其他说明:该研究不仅通过建模仿真全面验证了论文实验结论,还提出了具体的操作参数优化建议,如吸氢阶段维持25-30°C,氢气流速0.012g/s;放氢阶段快速升温至70-75°C,水速18-20g/min。同时,文章还强调了安全考虑,如最高工作压力限制在5bar以下,温度传感器冗余设计等。未来的研究方向包括多尺度建模、新型换热结构和智能控制等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值