Score After Flipping Matrix

[leetcode]Score After Flipping Matrix

链接:https://leetcode.com/problems/score-after-flipping-matrix/description/

Question

We have a two dimensional matrix A where each value is 0 or 1.

A move consists of choosing any row or column, and toggling each value in that row or column: changing all 0s to 1s, and all 1s to 0s.

After making any number of moves, every row of this matrix is interpreted as a binary number, and the score of the matrix is the sum of these numbers.

Return the highest possible score.

Example 1

Input: [[0,0,1,1],[1,0,1,0],[1,1,0,0]]
Output: 39
Explanation:
Toggled to [[1,1,1,1],[1,0,0,1],[1,1,1,1]].
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39


Note:

1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j] is 0 or 1.

Solution

// 想法是先通过toggle每一个row让每一行的第一个数字是1,然后逐行toggle后面的每一列,让每一列的1最多
class Solution {
public:
  int matrixScore(vector<vector<int>>& A) {
    int row = A.size();
    int col = A[0].size();
    int cnt = 0;
    for (int i = 0; i < row; i++) {
      if (A[i][0] == 0) {
        for (int j = 0; j < col; j++) {
          A[i][j] = !A[i][j];
        }
      }
      cnt += (1 << (col-1));
    }
    for (int j = 1; j < col; j++) {
      int zeros = 0, ones = 0;
      for (int i = 0; i < row; i++) {
        if (A[i][j] == 0) zeros++;
        else ones++;
      }
      int max_val = max(zeros, ones);
      cnt += (1 << (col-j-1))*max_val;
    }
    return cnt;
  }
};

思路:看代码注释~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C语言的LDPC Modified Weighted Bit Flipping算法的代码示例: ```c #include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> #define N 2048 //码长 #define K 1024 //信息位数 #define M 1024 //校验位数 #define p 0.01 //BSC信道误码率 #define MAX_ITER 50 //最大迭代次数 #define tau 2.0 //重要性参数 double H[M][N]; //LDPC矩阵 int d[N]; //接收端接收的码字 double r[N]; //接收端的对数似然比 double q[N]; //对数似然比的绝对值 double x[N]; //解码后的信息位 int perm[N]; //随机置换序列 double c[M]; //校验和 int iter_cnt = 0; //迭代次数计数器 //生成LDPC矩阵 void gen_LDPC_matrix() { int i,j,k; int col[N]; int row[M]; srand((unsigned)time(NULL)); for(i=0;i<M;i++) for(j=0;j<N;j++) H[i][j]=0; for(i=0;i<N;i++) perm[i]=i; for(i=0;i<M;i++) row[i]=i; for(i=0;i<N;i++) col[i]=i; for(i=0;i<N;i++) { k = rand()%(N-i) + i; j = perm[i]; perm[i] = perm[k]; perm[k] = j; } for(i=0;i<K;i++) { for(j=0;j<N/K;j++) { H[i][col[i*N/K+j]] = 1; } } for(i=K;i<M;i++) { for(j=0;j<N/K;j++) { H[i][col[(rand()%(N/K))+j*N/K]] = 1; } } } //BSC信道模拟 void BSC_channel() { int i; for(i=0;i<N;i++) { if((double)rand()/RAND_MAX < p) d[i] = 1-d[i]; r[i] = log((1-p)/p); if(d[i]==1) r[i] = -r[i]; q[i] = fabs(r[i]); } } //判断校验方程是否满足 int check_equations() { int i,j; int flag = 0; for(i=0;i<M;i++) { c[i] = 0; for(j=0;j<N;j++) { if(H[i][j]==1) c[i] += x[j]; } c[i] = fmod(c[i],2); if(c[i]!=0) flag = 1; } return flag; } //Modified Weighted Bit Flipping算法 void MWBF() { int i,j,k; double w[N]; double sum_w = 0; double f[N]; double delta[N]; double sum_delta = 0; double p0,p1; while(iter_cnt < MAX_ITER && check_equations()) { iter_cnt++; for(i=0;i<N;i++) { w[i] = 1/(1+exp(q[i])); if(x[i]==1) w[i] = 1-w[i]; sum_w += w[i]; } for(i=0;i<N;i++) { f[i] = 1; for(j=0;j<M;j++) { if(H[j][i]==1) f[i] *= (2*c[j]-1); } delta[i] = log((1-w[i])/w[i]) + f[i]/sum_w/tau; sum_delta += fabs(delta[i]); } while(sum_delta>1e-6) { k = 0; for(i=1;i<N;i++) { if(delta[i]>delta[k]) k = i; } x[k] = 1-x[k]; p0 = p/(1-p); p1 = (1-p)/p; for(i=0;i<M;i++) { if(H[i][k]==1) { if(c[i]==0) p1 *= (1-2*w[k]); else p0 *= (1-2*w[k]); } } r[k] = log(p0/p1); if(x[k]==1) r[k] = -r[k]; q[k] = fabs(r[k]); sum_delta = 0; for(i=0;i<N;i++) { f[i] = 1; for(j=0;j<M;j++) { if(H[j][i]==1) f[i] *= (2*c[j]-1); } delta[i] = log((1-w[i])/w[i]) + f[i]/sum_w/tau; sum_delta += fabs(delta[i]); } } sum_w = 0; sum_delta = 0; } } int main() { int i; double BER; gen_LDPC_matrix(); for(i=0;i<N;i++) d[i] = rand()%2; BSC_channel(); MWBF(); BER = 0; for(i=0;i<K;i++) BER += x[i] ^ d[i]; BER /= K; printf("BER = %f\n",BER); return 0; } ``` 该代码实现了一个N=2048,K=1024的LDPC码的解码,使用的是BSC信道。算法采用了Modified Weighted Bit Flipping算法,重要性参数tau默认为2。代码中使用了对数似然比,避免了浮点数下溢问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值