文章

10

粉丝

399

获赞

14

访问

100.7k

头像
动态规划&&字符串翻转
P1642 杭州电子科技大学机试题
发布于2020年3月16日 11:41
阅读数 8.1k

这个题如果看了对应的动态规划的视频或者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;
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发