题目给了我们一组数,要我们求一次变换(即对一个范围内的数字,0变1,1变0)之后,能得到的最大的1的个数。因为数据<=100,所以暴力是能过的,但是同样我们可以动态规划,找出更优秀的解法。
- 暴力
#include<iostream>
using namespace std;
int main()
{
int t,num[105];//用数组存储数据
cin>>t;
for(int a=0;a<t;a++)
cin>>num[a];
int count=0;
for(int a=0;a<t;a++)//遍历,从头开始,把1和0都变了
{
for(int b=a;b<t;b++)
{
int temp=0;//存对应情况的变化后1的个数
for(int c=a;c<=b;c++)
{
if(num[c]==0)
num[c]=1;
else if(num[c]==1)
num[c]=0;
}
for(int d=0;d<t;d++)
{
if(num[d]==1)temp++;
}
if(temp>=count)
count=temp;//count取最大值
for(int c=a;c<=b;c++)//记得变回来,不然下次就物是人非了
{
if(num[c]==0)
num[c]=1;
else if(num[c]==1)
num[c]=0;
}
}
}
cout<<count;
return 0;
}
2.动态规划
我们实际上就是要求最多可以变的0的个数,我们可以想办法把他求出来,在这里,我用s1存储1的个数,用s0存储可以变化的0的最大个数
比如说1 0 0 1 1 0
我们肯定只变中间的一段
得到1 1 1 1 1 0
答案是5
我们取s0,一旦有0,便加上一,从此后,遇见1,便减去一,时刻取最大的s0,
这里需要思考;基本思路就是这样
#include<iostream>
using namespace std;
int main()
{
int t,s0=0,s1=0,temp=0;cin>>t;
int n=t;//n用于之后,表示数字个数
while(t--)
{
int x;cin>>x;
if(x)//如果x是1的话
{
s0--;
s0=max(s0,0);//s0肯定非负
s1++;
}
else
{
s0++;
temp=max(s0,temp);
}
}
if(s1==n)//因为至少要变一次,所以对应全是1的情况,我们必须减1输出
cout<<n-1;
else
cout<<temp+s1;//1的个数加上可以变得0的个数
return 0;
}