SRM 555 DIV 2

255pt:

题意:

给一个01矩阵,要求改变一行和一列是它的总和最大,求最大的总和,枚举行列,然后取抑或O(n^3)做即可;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a,b) (a) > (b)? (b):(a)
#define Max(a,b) (a) > (b)? (a):(b)

#define ll long long
#define inf 0x7f7f7f7f
#define MOD 100000007
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 100007
#define N 107
using namespace std;
//freopen("din.txt","r",stdin);


class XorBoardDivTwo{
    public:
    int theMax(vector <string> board){
        int a[55][55];
        int i,j;
        int sz = board.size();
        int len = board[0].size();
        int sum = 0;
        for (i = 0; i < sz; ++i){
            for (j = 0; j < len; ++j){
                a[i][j] = board[i][j] - '0';
                sum += a[i][j];
            }
        }
        int ans = -inf;
        int row,col;
        for (i = 0; i < sz; ++i){
            for (j = 0; j < len; ++j){
                int tmp = sum;
                for (col = 0; col < len; ++col){
                    a[i][col] ^= 1;
                    if (a[i][col] == 0) tmp--;
                    else tmp++;
                }
                for (row = 0; row < sz; ++row){
                    a[row][j] ^= 1;
                    if (a[row][j] == 0) tmp--;
                    else tmp++;
                }
                if (ans < tmp) ans = tmp;
                for (col = 0; col < len; ++col) a[i][col] ^= 1;
                for (row = 0; row < sz; ++row) a[row][j] ^= 1;
            }
        }
        return ans;
    }
};

 

500pt;时间证明自己还是很弱,写完了测完样例刚想交呢,时间到了,无语,赛后提交过了。速度还是没有跟上。。

题意:

给定一个01串,将它分割成若干子串,子串的第一个数不能为0,而且每个子串要求保证是5的幂,求最小分割的快数;

思路:

DP: dp[i] = min(dp[i],dp[j] + 1)   j是所有满足小于等于i且j + 1 与i这段子串满足5的幂。

首先预处理一下,求出每个点和他前边的点能够形成5的幂的点,并记录,然后就是O(n)走一遍dp;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a,b) (a) > (b)? (b):(a)
#define Max(a,b) (a) > (b)? (a):(b)

#define ll long long
#define inf 0x7f7f7f7f
#define MOD 100000007
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 100007
#define N 107
using namespace std;
//freopen("din.txt","r",stdin);


class CuttingBitString{
    public:
    int dp[55];
    ll Pow(int a,int b){
        ll sum = 1;
        for (int i = 1; i <= b; ++i){
            sum *= a;
        }
        return sum;
    }
    //检查是否为5的幂
    bool is5pow(int j,int i,int *a){
        ll s = 0;
        for (int t = j,ct = 0; t >= i; --t,++ct){
            s += (ll)a[t]*Pow(2,ct);
        }
        while (s%5 == 0){
            s /= 5;
        }
        if (s != 1) return false;
        else return true;
    }
    int getmin(string S){
        struct node{
            int pre[55];// 记录当前点前边可以与他形成5的幂的点
            int len;
        }b[55];
        CL(b,0);

        int i,j;
        int a[55];
        int sz = S.size();

        for (i = 0; i < sz; ++i) a[i + 1] = S[i] - '0';

        //记录过程
        for (i = 1; i <= sz; ++i){
            if (a[i] == 0) continue;
            for (j = i; j <= sz; ++j){
                if (is5pow(j,i,a)){
                    b[j].pre[b[j].len++] = i - 1;
                }
            }
        }

        for (i = 1; i <= sz; ++i) {
            dp[i] = inf;
        }
        dp[0] = 0;
        for (i = 1; i <= sz; ++i){
           // printf("I,B[i]len %d %d\n",i,b[i].len);
            for (j = 0; j < b[i].len; ++j){
                int tmp = b[i].pre[j];
                //printf(">>%d\n",tmp);
                dp[i] = min(dp[i],dp[tmp] + 1);
            }
        }
        /*for (i = 1; i <= sz; ++i) printf("%d ",dp[i]);
        test;*/
        if (dp[sz] == inf) return -1;
        else return dp[sz];
    }
};

  

posted @ 2012-09-07 21:26  E_star  阅读(289)  评论(0编辑  收藏  举报