LA 4256 商人
题目链接:https://vjudge.net/contest/160916#problem/B
题意:给一个无向图,和一个序列;要求,在这个序列中,两两相连的两个数相同,或者,在无向图中相邻;(n<=200)
分析:
d[i][j] 前 I 个数,最后一位是 j 时,最少的改动量;
我的渣的地方,就是,相同的时候,前面那个和我要改动的相同;
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 205; 6 const int inf = 0x3f3f3f3f; 7 bool maps[maxn][maxn]; 8 int d[maxn][maxn]; 9 int a[maxn]; 10 11 int main() 12 { 13 int t; 14 scanf("%d",&t); 15 while(t--) 16 { 17 int n,m; 18 scanf("%d%d",&n,&m); 19 20 memset(maps,0,sizeof(maps)); 21 memset(d,inf,sizeof(d)); 22 23 for(int i=0; i<m; i++) 24 { 25 int u,v; 26 scanf("%d%d",&u,&v); 27 maps[u][v] = maps[v][u] = 1; 28 } 29 30 int k; 31 scanf("%d",&k); 32 for(int i=1; i<=k; i++) 33 scanf("%d",&a[i]); 34 35 for(int i=1; i<=n; i++) 36 { 37 d[1][i] = 1; 38 } 39 d[1][a[1]] = 0; 40 41 int ans = inf; 42 for(int i=2; i<=k; i++) //长度 43 { 44 for(int j=1; j<=n; j++) //d[i][j]最后面是j 45 { 46 int cast = j==a[i] ? 0:1; 47 for(int m=1; m<=n; m++) //枚举前面那个数 48 { 49 50 if(maps[j][m]||j==m) 51 d[i][j] = min(d[i][j],d[i-1][m]+cast); 52 if(i==k) 53 ans = min(ans,d[i][j]); 54 } 55 } 56 } 57 printf("%d\n",ans); 58 } 59 return 0; 60 }