求最大区间和。思路:0被翻身后得到1,1被翻身后得到0。相当于0被翻身后1的总个数增加1,而1被翻身后1的总个数减少1。动态规划求到i截止的区间中最大的区间和(求对原数组影响值(即增加的1的个数,不可能为非正数)的最大值)。附C++代码:
#include <bits/stdc++.h> using namespace std; int main() { int n, cnt=0, fish[100000];//cnt存初始有梦想咸鱼(1)的个数 cin>>n; for(int i=0; i<n; i++) { cin>>fish[i]; if(fish[i]) cnt++; } if(!(n-cnt)) {cout<<n-1<<endl; return 0;}//特判全部咸鱼都有梦想(全都是1)的情况 int ans=0, current_fish=0;//ans求最大影响值;current_fish求以第i条咸鱼作为最后一条翻身的咸鱼时最大的影响值 for(int i=0; i<n; i++) { if(fish[i]) fish[i]=-1; else fish[i]=1; current_fish=max(0, current_fish)+fish[i]; ans=max(ans, current_fish); } cout<<ans+cnt<<endl;//最后的输出应为初始翻身咸鱼数+影响值 return 0; }
本来努力了一下试图自己翻身,结果还是在大佬的帮助下才翻的身……
本来是翻身了的,翻身后对总的数量的贡献是-1,本来没有翻身的,翻身后对总的贡献为1 原本的0 1序列可以变成1 -1序列 可以将0 1序列中的一段翻身要最后的结果和最大 其实就是求转化为1 -1序列后的最大连续子序列和 当然算出的最大连续子序列和是翻身后的增量 结果是初始的数量加上增量
求最大区间和。思路:0被翻身后得到1,1被翻身后得到0。相当于0被翻身后1的总个数增加1,而1被翻身后1的总个数减少1。动态规划求到i截止的区间中最大的区间和(求对原数组影响值(即增加的1的个数,不可能为非正数)的最大值)。附C++代码:
本来努力了一下试图自己翻身,结果还是在大佬的帮助下才翻的身……
本来是翻身了的,翻身后对总的数量的贡献是-1,本来没有翻身的,翻身后对总的贡献为1
原本的0 1序列可以变成1 -1序列
可以将0 1序列中的一段翻身要最后的结果和最大
其实就是求转化为1 -1序列后的最大连续子序列和
当然算出的最大连续子序列和是翻身后的增量
结果是初始的数量加上增量