题目链接
题意:找出某一个给定的序列,然后找出两段子序列,使得两个子序列
∣
|
∣ 起来最大。
本身肯定会选择,另一个选择的时候就从原序列中开头为1的选择长度就是从第一个0到最后一个0的长度之间选择就即刻,掐头去尾后直接暴力即可,但是不知道为什么不超时……。
下面是AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
cin>>s;
s=" "+s;
int id1=-1,id2=-1,tmp=-1;
for(int i=1;i<=n;i++)
{
if(s[i]=='1')
{
tmp=i;
break;
}
}
if(tmp==-1)
{
cout<<0<<endl;
return 0;
}
for(int i=tmp;i<=n;i++)
{
if(s[i]=='0')
{
if(id1==-1)
{
id1=i;
id2=i;
}
else id2=i;
}
}
int len=id2-id1+1;
string mx="0";
for(int i=tmp;i<id1;i++)//枚举1的位置
{
string f="";
for(int j=0;j<len;j++)
{
if(s[j+i]=='1'||s[j+id1]=='1') f+='1';
else f+='0';
}
mx=max(mx,f);
}
for(int i=tmp;i<id1;i++) cout<<'1';
cout<<mx;
for(int i=id2+1;i<=n;i++) cout<<'1';
cout<<endl;
return 0;
}