最长01串(贪心)
2015-08-30 21:34
253 查看
一行一个整数,最长的0与1的个数相等的子串的长度。
思路:统计0与1的个数在串里相同且最大长度。可以见0就让ans--,1就++,当值为0的时候就比较一下当前的ma与i+1的大小
,但是有个问题就是当为000000000001111111111111(0的个数=1的个数)时会输出0,而不是20(假设1==0 位20个)。
1011 1111 1010
示例输出
2 0 4
思路:统计0与1的个数在串里相同且最大长度。可以见0就让ans--,1就++,当值为0的时候就比较一下当前的ma与i+1的大小
,但是有个问题就是当为000000000001111111111111(0的个数=1的个数)时会输出0,而不是20(假设1==0 位20个)。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<math.h> #include<queue> #define inf 1000010+10 using namespace std; char s[inf]; int dp[2*inf]; int main() { int n,m,i,j,k,ma; while(~scanf("%s",s)) { int ans=0,ma=0; memset(dp,-1,sizeof(dp)); dp[inf]=0;//设置一个中间值,使得当如1010,或000111类似的加和为1,直接用当前的位置减去0即可. for(i=0;s[i]!='\0';i++) { if(s[i]=='1') ans++; else if(s[i]=='0') ans--; if(dp[ans+inf]==-1)//自-的越多拥有的dp值越大, dp[ans+inf]=i+1; else ma=max(ma,i+1-dp[ans+inf]);//当再相加的时候,dp下标值越小相应的-的值也越小,获得的值越大 } printf("%d\n",ma); } return 0; } <span id="transmark"></span>
相关文章推荐
- LeetCode Interleaving String DP
- hdu5416CRB and Tree 异或
- 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~
- 第二第三周实训就这样子过去了
- Notepad++改造成C/C++ IDE [真正意义上的IDE]
- jQueryMobile的组件之下拉菜单(selectMenu)
- 《第一行代码》读书笔记(三)----UI开发(下)
- Round Up To Power Of Two
- shell脚本
- android viewconfiguration
- ubuntu下安装chorme浏览器
- 邻接表代码
- RAID常用等级介绍
- Codeforces Round #318-(B. Bear and Three Musketeers)
- 自己实现简易的内存泄露检测工具VLD
- Android进阶之大话设计模式(二)
- leetcode:Median of Two Sorted Arrays
- openwrt端口回流的关键
- 反转单词
- 阮奇桢《我和LabVIEW》示例程序下载地址