标签:des style blog http color os io ar for
30%的数据,满足 1 <= N,M <= 10 ; 0 <= T <= 100 。
100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<queue> 11 #include<string> 12 #define inf 1000000000 13 #define maxn 50+10 14 #define maxm 500+100 15 #define maxt 2500+100 16 #define eps 1e-10 17 #define ll long long 18 #define pa pair<int,int> 19 using namespace std; 20 inline int read() 21 { 22 int x=0,f=1;char ch=getchar(); 23 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 24 while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();} 25 return x*f; 26 } 27 int n,m,t,a[maxn],b[maxn][maxn],f[maxt]; 28 inline bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 inline int calc(int x,int y) 33 { 34 int tt[2];tt[1]=0;tt[0]=0; 35 for(int i=x;i<=y;i++)tt[a[i]]++; 36 return max(tt[0],tt[1]); 37 } 38 int main() 39 { 40 freopen("input.txt","r",stdin); 41 freopen("output.txt","w",stdout); 42 n=read();m=read();t=read(); 43 f[0]=1; 44 for(int i=1;i<=n;i++) 45 { 46 char ch=‘ ‘; 47 while(ch<‘0‘||ch>‘1‘)ch=getchar();a[1]=ch==‘1‘?1:0; 48 for(int j=2;j<=m;j++)ch=getchar(),a[j]=ch==‘1‘?1:0; 49 memset(b,0,sizeof(b)); 50 for(int j=1;j<=m;j++) 51 for(int k=1;k<=min(m,t);k++) 52 for(int l=k-1;l<j;l++) 53 b[j][k]=max(b[j][k],b[l][k-1]+calc(l+1,j)); 54 for(int j=t;j>=1;j--) 55 for(int k=1;k<=min(m,t);k++) 56 if(f[j-k])f[j]=max(f[j],f[j-k]+b[m][k]); 57 } 58 printf("%d\n",f[t]-1); 59 return 0; 60 }
看题解发现还有一个前缀和优化,可以每次转移达到O(1),a[i]表示1..i有几个1就OK了,加上这个优化时间缩成了1/3.
代码:
标签:des style blog http color os io ar for
原文地址:http://www.cnblogs.com/zyfzyf/p/3942733.html