文章
10
粉丝
399
获赞
14
访问
100.7k
这个题如果看了对应的动态规划的视频或者n诺的教程,这个题的原理应该不难理解。
主要是有两个细节,这里我最开始考虑的是把输入的字符0换做-1,字符1就是1,为了统计数量方便,和最大字段和的思路一样。
后来发现没有必要,这里是动态规划的思想,没必要强行去套格式,主要是理解到这里的核心是这里的递推或者说迭代更新,不需要强行去修改原来的字符串。
实际上,要找到动态规划中的递推式并不容易,如果是机试遇到的题目没有见过,那还是大概率凉凉,还是要多积累。
另一个细节是这里的dp数组记录的是差值,即我们需要的值,我想这个是关键点,无论是不是动态规划,这个翻转的本质就是某子段中的数量差值,这是很自然能想到的。
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
while(cin>>n){
string s;
cin>>s;
int sum = 0,sum1=0,dp[n];
if(s[0]=='0'){dp[0]=1;}
else {dp[0] = 0;sum1++;}//这里是对于递推式的首项
for(int i=1;i<n;i++){
if(s[i]=='0') { dp[i] =dp[i-1]++;}
else {sum1++;dp[i] = max(dp[i-1]--,0);} //这里的sum1是统计1的数量
sum = max(sum,dp[i]);} //这里的sum是0和1之间的数量差值,并不是0的数量
cout<<sum1+sum<<endl;
}
return 0;
}
登录后发布评论
暂无评论,来抢沙发