傅老大练神功

Problem E: 傅老大练神功

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 43   Solved: 13

Submit 

Description

傅老大最近得到的一本葵花宝典,他学会一招踩一脚可以将连续区间树叶子翻转过来,正面变反面,反面变正面(然而并没有什么用),傅老大现在想知道他踩一脚后最多有多少树叶处于正面

注意:傅老大至少踩一片树叶

Input

含有多组测试数据

一组一行01的字符串,1代表树叶处于正面,0代表树叶处于反面

字符串长度最长不超过1000

Output

一行一个数字代表傅老大踩完一脚之后最多有多少树叶处于正面(至少踩一个地方)

Sample Input

10010
010

Sample Output

4
2

HINT


对于第一个样例,傅老大踩区间[2,3],序列变为11110。



对于第二个样例,傅老大踩整个区间,序列变为101。

Submit


求最大字串和

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;

void dis(int a[], int n){
	printf("总数为%d个\n",n); 
	for(int i = 1; i <= n; i++) 	cout<<a[i]<<", ";
	cout<<endl<<"------------------"<<endl;		
}

const int mx = 1100;
char  st[mx];
int num[mx],dp[mx]; 
int main(){
	while(scanf("%s",st+1) != EOF){
		int len = strlen(st+1);
		memset(num,0,sizeof(num));
		memset(dp,0,sizeof(dp));
		//cout<<len<<endl;
		for(int i = 1; i <= len ;i++){
			if(st[i] == '1'){
				num[i] = num[i-1]+1;
				dp[i] = -1;
			}
			else{
				num[i] = num[i-1];
				dp[i] = 1;
			}
		
		} 
		//dis(num,len);
		int ans = 0,te=-3,nowbe,nowen,nowmx = -1,mxb,mxe;
		for(int i = 1; i <= len; i++){
			if(nowmx < 0){
				nowbe = i;
				nowen = i;
				nowmx = dp[i];
			}
			else{
				nowen = i;
				nowmx += dp[i];
			}
			if(nowmx >te){
				te = nowmx;
				mxb =nowbe;
				mxe = nowen;
				//ans = max(ans,num[nowbe-1]+num[len - nowen]+nowmx);
			}
		}
		//printf("mxb =%d, mxe =%d\n",mxb,mxe);
		for(int i = mxb; i <= mxe; i++)
			if(st[i] == '0')
				ans++;
		//printf("qian =%d, hou =%d\n",num[mxb-1],num[len - mxe]);
		ans += num[mxb-1]+num[len] - num[mxe];
		cout<<ans<<endl;
	}
	
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blaze Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值