power oj 3136: Zed的影流部队

本文介绍了一种使用二维动态规划解决特定矩阵问题的方法,通过定义状态dp[i][j]来记录前i列异或和为j的最少改变次数,最终求得将矩阵调整为目标异或和所需的最小操作数。

题目

定义 d p [ i ] [ j ] dp[i][j] dp[i][j]为前i列异或和为j的最少改变次数。
这道题细节挺多的,由于本人太懒,不推了!

#include <bits/stdc++.h>
 
using namespace std;
 
#define rep(i, x, y) for(int i=(x);i<=(y);++i)
#define dep(i, x, y) for(int i=(x);i>=(y);--i)
const int INF = 0x3f3f3f3f;
const int maxn = 1090;
int g[maxn][maxn];
int dp[maxn][1026];
int s[maxn][maxn];
int main(){
 
    int n, m;
    cin >> n >> m;
    rep(i, 1, n)
    {
        rep(j, 1, m)
        {
           scanf("%d",&g[i][j]);
        }
    }
    unordered_map<int, int> mp;
    unordered_map<int, int>::iterator it;
    int MIN = INF, Min = INF;
    for (int i = 1; i <= m; i++)
        rep(j, 0, 1024)
    dp[i][j] = INF;
    rep(j, 1, n)
    {
        mp[g[j][1]]++;
    }
    for (int i = 0; i <= 1024; i++) {
        dp[1][i] = n - mp[i];
        MIN = min(MIN, dp[1][i]);
    }
    Min = MIN;
    for (int i = 2; i <= m; i++) {
        mp.clear();
        MIN = INF;
        rep(j, 1, n)
        {
            mp[g[j][i]]++;
        }
 
        for (int j = 0; j < 1024; j++) {
            for (it = mp.begin(); it != mp.end(); it++) {
                int X = it->first;
                int num = it->second;
                dp[i][j ^ X] = min(min(dp[i][j ^ X], dp[i - 1][j] + n - num), Min + n);
                MIN = min(dp[i][j ^ X], MIN);
            }
        }
        Min = MIN;
    }
    cout << dp[m][0] << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值