【题解】网上没题解,我来贴个题解

#include <bits/stdc++.h>
  
using namespace std;
const int inf = 0x3f3f3f3f;
int n,m,a[22],dp[1<<20],val[1<<20];
char s[22];
int cal(int x)                 //将二进制字符串压缩成十进制数
{
    int res = 0,b = 1;
    for(int i = 0;i < m; ++i,b <<= 1) res += (s[i]=='1' ? b : 0);
    return res;
}
int cal2(int a,int b)             //计算a->b要花费的代价
{
    int res = 0;
    for(int i = 0;i < 22; ++i){
        if((a & (1<<i)) == 0 && (b & (1<<i))) res++;
    }
    return res * res;
}
int main()
{
    cin >> n >> m;
    for(int i = 0;i < n; ++i) cin >>s,a[i] = cal(i);
    memset(dp,inf,sizeof(dp));
    dp[0] = 0;
    for(int j = 0; j < (1<<n); ++j){
        for(int k = 0;k < n; ++k){
            if(!(j&(1<<k))){
                int tep = dp[j] + cal2(val[j],a[k]);
                if(dp[j|(1<<k)] > tep){
                    dp[j|(1<<k)] = tep;
                    val[j|(1<<k)] = val[j] | a[k];
                }
            }
        }
    }
    cout << dp[(1<<n) - 1] ;
    return 0;
}
全部评论
拒绝长代码(雾 #include <bits/stdc++.h> using namespace std; int sqr(int x) {return x * x;} void chmin(int &x, int y) {if (x > y) x = y;} int dp[1 << 20], n, m, a[21], vis[1 << 20], S, ans; char s[25]; int main() {   cin >> n >> m;   for (int i = 0; i < n; ++i) {     cin >> s;     for (int j = 0; j < m; ++j) if (s[j] == '1') a[i] |= 1 << j;   }   for (int S = 0; S < (1 << n); ++S)      for (int i = 0; i < n; ++i) if (S & (1 << i)) vis[S] |= a[i];   memset(dp, 0x3f, sizeof dp);   dp[0] = 0;   for (int S = 0; S < (1 << n); ++S) {     for (int i = 0; i < n; ++i)        if (!(S & (1 << i))) chmin(dp[S | (1 << i)], dp[S] +             sqr(__builtin_popcount(vis[S | (1 << i)] ^ (vis[S | (1 << i)] & vis[S]))));   }   cout << dp[(1 << n) - 1];   return 0; }
点赞 回复 分享
发布于 2019-03-29 13:58
感谢你的关注!😀https://ac.nowcoder.com/discuss/162449?type=101&order=0&pos=1&page=1
点赞 回复 分享
发布于 2019-08-15 17:32

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务