首页 > 其他 > 详细

Codeforces 1102F

时间:2020-02-12 12:53:00      阅读:57      评论:0      收藏:0      [点我收藏+]

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

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

状压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\n",ans);
38 }
View Code

 

Codeforces 1102F

原文:https://www.cnblogs.com/uuzlove/p/12298252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!