给定一个长度为 n1 ( n1≤100 ) 的点的无向连通图和一个长度为 n 的序列 A ( n≤200 ) ,1<=A[i]<=n1
希望修改尽量少的数,使得序列的任意相邻两个数在图上是是相邻节点,或者相同
n<=100 ,直接暴力
枚举位置i,i-1 的值, 那么就可以转移
如果 k==j ,g[k][j]=1
f[i][j] = min( f[i-1][k]+1 )
= min(f[i-1][k]) , j==a[i]
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N=400,inf=1e9; int n1,m,n; int g[N][N],a[N],f[N][N]; void solve(){ int x,y,i,j,k; cin>>n1>>m; memset(g,0,sizeof g); for(i=1;i<=n1;i++) g[i][i]=1; for(i=1;i<=m;i++) cin>>x>>y,g[x][y]=g[y][x]=1; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) f[1][i]=1; f[1][a[1]]=0; for(i=2;i<=n;i++){ for(j=1;j<=n1;j++){ f[i][j]=inf; for(k=1;k<=n1;k++) if(g[j][k]) { if(j==a[i]) f[i][j]=min(f[i][j],f[i-1][k]); else f[i][j]=min(f[i][j],f[i-1][k]+1); } } } int ans=inf; for(i=1;i<=n1;i++) ans=min(ans,f[n][i]); cout<<ans<<endl; } int main(){ int cas; cin>>cas; while(cas--) solve(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!