题目链接:http://codeforces.com/problemset/problem/548/B
有一个n*m的矩阵,里面只有0和1,现在有Q个改变,每次都把(x,y)这点变为相反的点(0变1,1变0),每次改变后求所有行中最多有多少个连续的1;
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> #define N 505 #define INF 1e16 #define met(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long LL; int G[N][N], dp[N][N], n, m, q, Max[N]; ///Max[i]代表第i行的最大连续个数; int main() { while(scanf("%d %d %d", &n, &m, &q)!=EOF) { met(dp, 0); met(G, 0); met(Max, 0); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d", &G[i][j]); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(G[i][j]) { dp[i][j] = dp[i][j-1] + 1; Max[i] = max(Max[i], dp[i][j]); } Max[i] = max(Max[i], dp[i][j]); } } for(int i=1; i<=q; i++) { int ans = 0; int x, y; scanf("%d %d", &x, &y); G[x][y] ^= 1;///学长说我的代码太丑-_- Max[x] = 0; for(int j=1; j<=m; j++) { dp[x][j] = 0;///初始化;一定要有; if(G[x][j]) dp[x][j]=dp[x][j-1]+1; Max[x] = max(Max[x], dp[x][j]); } for(int j=1; j<=n; j++) ans = max(Max[j], ans); printf("%d\n", ans); } } return 0; }
B. Mike and Fun---cf548B(暴力求解)
原文:http://www.cnblogs.com/zhengguiping--9876/p/5008459.html