BOJ262 Channel Coding DP

来源:互联网 发布:关系型数据库rds 编辑:程序博客网 时间:2024/06/05 02:12

题意:

给一串数字,里面只包含0 -1 1三种数字。

问和为0的最长连续子串。

思路:

遍历一遍,求每个i的sum[i],代表从第一个数字到这个数字的和。

显然如果sum[i]=sum[j],则从i+1到j这j-i个数字的和=0。即次数所求的D=j-i-1。


#include<iostream>#define max(a,b) (a>b?a:b)#define min(a,b) (a<b?a:b)using namespace std;const int N=50005;int n;int data[N];int pos[N];int neg[N];int mx;int main(){int cases;scanf("%d",&cases);while(cases--){mx=0;memset(pos,-1,sizeof(pos));memset(neg,-1,sizeof(neg));pos[0]=0;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",data+i);for(int i=1;i<=n;i++){data[i]+=data[i-1];if(data[i]>=0){if(pos[data[i]]<0){pos[data[i]]=i;}else{mx=max(mx,i-pos[data[i]]);}}else{if(neg[-data[i]]<0){neg[-data[i]]=i;}else{mx=max(mx,i-neg[-data[i]]);}}}if(mx>1)printf("%d\n",mx-1);elseprintf("-1\n");}}



原创粉丝点击