Codeforces 1102F

考虑每行跑的顺序是一样的,那么预处理转移的最小差值

然后最后一个转移是行间转移,需要单独处理

状压DP求个哈密顿回路

复杂度(O(2^nn^3+n^2m))

 1 #include<bits/stdc++.h>
 2 #define maxs 70005
 3 #define maxn 18
 4 #define maxm 10005
 5 using namespace std;
 6 const int inf = (int)(1e9)+7;
 7 int n,m;
 8 int a[maxn][maxm];
 9 int w[maxn][maxn],nxtw[maxn][maxn];
10 int dp[maxn][maxs];
11 int main()
12 {
13     scanf("%d%d",&n,&m);
14     for(int i=1;i<=n;++i)
15         for(int j=1;j<=m;++j)scanf("%d",&a[i][j]);
16     for(int i=1;i<=n;++i)
17         for(int j=1;j<=n;++j)
18         {
19             w[i][j]=nxtw[i][j]=inf;
20             for(int k=1;k<=m;++k)w[i][j]=min(w[i][j],abs(a[i][k]-a[j][k]));
21             for(int k=1;k<m;++k)nxtw[i][j]=min(nxtw[i][j],abs(a[i][k]-a[j][k+1]));
22         }
23     int ans=0;
24     for(int st=0;st<n;++st)
25     {
26         memset(dp,0,sizeof(dp));
27         dp[st][1<<st]=inf;
28         for(int S=0;S<(1<<n);++S)
29         {
30             for(int i=0;i<n;++i)if(S&(1<<i))
31             {
32                 for(int j=0;j<n;++j)if(!(S&(1<<j)))dp[j][S|(1<<j)]=max(dp[j][S|(1<<j)],min(dp[i][S],w[i+1][j+1]));
33             }
34         }
35         for(int i=0;i<n;++i)ans=max(ans,min(dp[i][(1<<n)-1],nxtw[i+1][st+1]));
36     }
37     printf("%d
",ans);
38 }
View Code
原文地址:https://www.cnblogs.com/uuzlove/p/12298252.html