[JLOI2008] CODES

本文深入解析洛谷上一道尚未评定的难题,通过记忆化搜索算法解决字符串组合问题,追求最短组合路径。文章详细介绍了状态定义、环路判断、最优解更新及代码实现细节。

今天看了看这道在洛谷上尚未评定的题

虽说只是一道搜索题,可也不愧于他的尚未评定的难度

首先呢 各位对题意的理解可能是有一些偏差的

这道题可以重复使用同一个字符串!!!

设状态 dp[i][j] 表示 第 i 个字符串  还有长度为 j 的后缀未匹配,可以得到的最短答案。

考虑用记忆化搜索实现这个过程

if vis[i][j] 已经被走过了,说明形成了环路,接下来肯定就不应该被走了,直接return

if 已经有了dp[i][j]  则直接return dp[i][j] ,因为已经跑出了它的最优解了

在跑的同时,我们注意不断更新ans[i][j],并在ans相同时进行比较更换答案 否则就直接考虑更不更新

值得注意的是 对于所有的dp[n][i]=0 其余的dp值均为inf

这样就可以在到达最后有效情况时直接return了

代码我找的别人的,自己实在不想写了。。。

#include<bits/stdc++.h>
using namespace std;
char wd[21][21]={0};
int n=0,len[21]={0},dp[21][21]={0};
char answ[21][21][200]={0};
int vis[21][21]={0};
inline bool judgex(int a,int b,int pa,int pb,int l)
{
    for (int i=1;i<=l;i++) if (wd[a][pa+i-1]!=wd[b][pb+i-1]) return false;
    return true;
}
inline bool lex(int a,int b,int c,int d,int l)
{
    for (int i=1;i<=l;i++) if (answ[a][b][i]!=answ[c][d][i]) 
        return (answ[a][b][i]>answ[c][d][i]);
}
inline int minx(int now,int pos,int val,int p,int q)
{
    if (val>2*1e9) return min(dp[now][pos],val);
    if ((dp[pos][now]==val&&lex(now,pos,p,q,dp[p][q])) || dp[now][pos]>val) 
	{
        for (int i=1;i<=dp[p][q];i++) answ[now][pos][i]=answ[p][q][i];
        for (int i=dp[p][q]+1;i<=val;i++) answ[now][pos][i]=wd[p][q+i-dp[p][q]];
    }
    return min(dp[now][pos],val);
}
inline int _dp(int now,int pos)
{
    if (dp[now][pos]!=2*1e9) return dp[now][pos];
    for (int i=1;i<=n;i++) if (now!=i || pos!=len[i])
    {
        if (len[i]<=pos && !vis[now][pos-len[i]] && judgex(now,i,pos-len[i]+1,1,len[i]))
        {
            vis[now][pos-len[i]]=1;
            dp[now][pos]=minx(now,pos,_dp(now,pos-len[i])+len[i],now,pos-len[i]);
            vis[now][pos-len[i]]=0;
        }
        if (len[i]>pos && !vis[i][len[i]-pos] && judgex(now,i,1,len[i]-pos+1,pos))
        {
            vis[i][len[i]-pos]=1;
            dp[now][pos]=minx(now,pos,_dp(i,len[i]-pos)+pos,i,len[i]-pos);
            vis[i][len[i]-pos]=0;
        }
    }
    return dp[now][pos];
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%s",wd[i]+1),len[i]=strlen(wd[i]+1);
    for (int i=1;i<=20;i++) for (int j=1;j<=20;j++) dp[i][j]=2*1e9;
    int ans=2*1e9,p;
    for (int i=1;i<=n;i++)
    {
		vis[i][len[i]]=1;
        if (_dp(i,len[i])<ans) { ans=dp[i][len[i]]; p=i; }
        else if (ans!=2*1e9 && _dp(i,len[i])==ans && lex(p,len[p],i,len[i],ans)) p=i;
        vis[i][len[i]]=0;
    }
    printf("%d\n",ans);
    for (int i=1;i<=ans;i++) printf("%c",answ[p][len[p]][i]); printf("\n");
    return 0;
}

 

【从高压输电线的架空地线中汲取电能】一个25千瓦受控电源从735千伏线路的架空地线中汲取电能的SimPowerSystems模型(Simulink仿真实现)内容概要:本文介绍了一个基于SimPowerSystems的Simulink仿真模型,用于模拟从735千伏高压输电线的架空地线中汲取25千瓦电能的受控电源系统。该模型聚焦于高压输电线路中架空地线的能量回收技术,通过仿真手段实现对电能采集过程的建模与控制策略验证,体现了电力系统中新型能源获取方式的技术可行性与工程应用潜力。文中还提及该资源属于一系列电力系统仿真研究的一部分,涵盖微电网、储能优化、碳流追踪、鲁棒调度等多个前沿方向,配套提供Matlab/Simulink代码及网盘资料链接,便于科研人员复现与拓展研究。; 适合人群:具备电力系统基础知识、熟悉Matlab/Simulink仿真环境,从事电力工程、能源回收或智能电网相关研究的科研人员及研究生;有一定编程与建模仿真经验的高年级本科生或工程技术人员。; 使用场景及目标:①研究高压输电线路中架空地线的能量回收机制与建模方法;②掌握基于Simulink的电力系统仿真技术,特别是受控电源与电网交互的动态特性分析;③为开展能源 harvesting、分布式供能、电力电子变换器控制等相关课题提供参考模型与技术支撑; 阅读建议:建议结合提供的仿真模型文件进行实操演练,重点理解系统结构设计、参数设置与控制逻辑实现;同时可延伸学习文档中提到的其他电力系统优化与仿真案例,以拓宽研究视野和技术积累。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值