Matlab编程练习5

问题

(问题都是来源某牛的题,用matlab编程实现)

给你一个由若干 0 和 1 组成的字符串s,请 你计算并返回将该字符串分割成两个子字符 串(即左子字符串和右子字符串, 子字符串允许为空)所能获得的最大得分。
已知分割字符串的得分规则如下:
左子字符串中:0得2分,1得1分
右子字符串中:1得2分,0得1分
子字符串为空则得0分

输入例子
  输入描述:
  第一行为A公司的的人员id列表, 0< id数量 < 10000,用空格切分
  第二行为B公司的人员id列表, 0< id数量 < 10000,用空格切分
  下面有n行,每一行为每个子项目的合作对应关系,为两个id,第一个为A公司的员工id,第二个为B公司的员工id,用空格区分

011101

输出例子

11

例子说明
  当左子字符串 = “0” 且 右子字符串 = “11101”,得分最大= 2+ 9 = 11


解题思路

  这题难度不大,很明显可以有两种处理方法,1种是直接分割出左右字符串(分割策略是将0多的字符串分割左边,1多的字符分割到右边);第2种是直接穷举出所有左右字符串的组合,然后计算…


Matlab代码实现

s='0111000111011111110000001111001101001101';
if s(1)=='1'              %特例
    disp(2);
    return;
end
%% 非穷举分割策略,尽量将0分割到左字符串,将1分割到右字符串
%% 穷举
maxV=0;
for i=1:size(s,2)        %左字符串的长度
    left=[];
    right=[];
    maxl=0;
    maxr=0;
    for j=1:i            %左字符串
        if s(j)=='0'
            maxl=maxl+2;
        elseif s(j)=='1'
            maxl=maxl+1;
        end
    end
    for k=i+1:size(s,2)  %右字符串
        if s(k)=='1'
            maxr=maxr+2;
        elseif s(k)=='0'
            maxr=maxr+1;
        end
    end
    maxlr=maxl+maxr;
    if maxlr>maxV
        maxV=maxlr;
    end
end
disp(maxV);

总结

   这里我只实现了比较容易实现的穷举法,直接法留给读者…

你可能感兴趣的:(算法/编程)