问题
(问题都是来源某牛的题,用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);
总结
这里我只实现了比较容易实现的穷举法,直接法留给读者…