POJ1296

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define maxn 40005
#define rint register int
#define inf 0x3f3f3f3f
#define pb push_back
#define mod (int)1e9 + 7
using namespace std;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
inline void write(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(X> . 9 ) Write (X / 10 ); 
    the putchar (X % 10 + ' 0 ' );
     return ; 
} 

int n-, m, T, ANS; 
 int A [ 55 ] [ 55 ], DP [ 55 ] [ 2505 ], F [ 55 ] [ 55 ] [ 2505 ], SUM0 [MAXN], SUM1 [MAXN], pre [ 2 ] [ 55 ] [ 55 ];
 // F [i] [J] [K] denotes the i-th row to the j cells transfected with a maximum of k times the logarithm, dp [i] [k] denotes the i-th to k-th line with the number of most transfected 
char C; 

inline int max (int a, int b) { return a > b ? a : b; } 

signed main()
{
    n = read(), m = read(), t = read();
    for (rint i = 1; i <= n; ++i)
        for (rint j = 1; j <= m; ++j)
        {
            scanf("%1d", &a[i][j]);
            pre[ a[i][j] ][i][j] =     pre[ a[i][j] ][i][j - 1] + 1;
            pre[ a[i][j] ^ 1 ][i][j] =     pre[ a[i][j] ^ 1 ][i][j - 1];
        } 
    for (rint i = 1; i <= n; ++i)
      for (rint j = 1; j <= m; ++j)
        for (rint k = 1; k <= m; ++k)
          for (rint l = 0; l < j; ++l)
          {
              f[i][j][k] = max(f[i][j][k], f[i][l][k - 1] + pre[1][i][j] - pre[1][i][l]);
              f[i][j][k] = max(f[i][j][k], f[i][l][k - 1] + pre[0][i][j] - pre[0][i][l]);
          }
    for (rint i = 1; i <= n; ++i)
      for (rint j = 1; j <= t; ++j)
        for (rint k = 0; k <= min(m, j); ++k)
          dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + f[i][m][k]), ans = max(ans, dp[i][j]); 
    write(ans);
    return 0;
} 
 
View Code

 

Guess you like

Origin www.cnblogs.com/mxrmxr/p/11601026.html