Problem:
C - チョコレート
目の前に
M \times N
個のピースでできた板チョコがある．
    ピースには甘いピースと辛いピースの2種類があり，できるだけ多くの甘いピースを食べたい．
しかし，板チョコの食べ方にはルールがあり，以下のルールを守らなければならない．
あるピースを食べるためには，そのピースの真上に隣接するピースが存在せず，加えてそのピースの少なくとも左右どちらかにはピースが存在しない必要がある．
例えば，図のような形のチョコレートでは，赤く色付けされたピースを次に食べることができる．
また奇妙なことに，あるピースを食べるとそのピースの上下左右に隣接していてかつまだ食べられていないピースの味が変化する． (甘いピースは辛く，辛いピースは甘くなってしまう)
上手くチョコレートを食べると最大でいくつの甘いピースを食べることができるだろうか?
入力形式
入力は以下の形式で与えられる．
M
N
a_{11}
…
a_{1N}
a_{21}
…
a_{2N}
:
a_{M1}
…
a_{MN}
a_{ij} = 0
のとき上からi番目，左からj番目のピースが辛く，
a_{ij} = 1
のとき上からi番目，左からj番目のピースが甘いことを表わしている．
出力形式
食べることのできる甘いピースの個数の最大値を一行に出力せよ．
制約
1 \leq N，M \leq 100
0 \leq a_{ij} \leq 1
入力値はすべて整数である．
入出力例
入力例1
2 3
1 1 1
1 1 1
出力例1
5
入力例2
4 2
1 0
0 1
0 1
0 1
出力例2
8

Submitted solutions:

code_snippet: #include <iostream>
using namespace std;
int dir[] = { 0, 1, 0, -1 };
int H, W, a[109][109];
int main() {
	cin >> H >> W;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			cin >> a[i][j];
		}
	}
	int ret = 0;
	for (int i = 0; i < H * W; i++) {
		int pos = -1, r = -999999999;
		for (int j = 0; j < W; j++) {
			if (a[H - 1][j] == -1) continue;
			int res = 0;
			for (int k = 0; k < H; k++) {
				if (a[k][j] != -1) {
					if ((j >= 1 && a[k][j - 1] != -1 ? 1 : 0) + (j <= H - 2 && a[k][j + 1] != -1 ? 1 : 0) == 0) break;
					if (a[k][j] == 1) res++;
					for (int l = 0; l < 4; l++) {
						int tx = k + dir[l], ty = j + dir[l ^ 1];
						if (0 <= tx && tx < H && 0 <= ty && ty < W) {
							if (a[tx][ty] == 1) res--;
							if (a[tx][ty] == 0) res++;
						}
					}
					break;
				}
			}
			if (r < res) {
				r = res;
				pos = j;
			}
		}
		for (int j = 0; j < H; j++) {
			if (a[j][pos] != -1) {
				ret += a[j][pos];
				a[j][pos] = -1;
				for (int k = 0; k < 4; k++) {
					int tx = j + dir[k], ty = pos + dir[k ^ 1];
					if (0 <= tx && tx < H && 0 <= ty && ty < W && a[tx][ty] != -1) {
						a[tx][ty] ^= 1;
					}
				}
				break;
			}
		}
	}
	cout << ret << endl;
	return 0;
}
accuracy: 0.09302325581395349
time_ms: 10
memory_kb: 3084
final_rank: 5

code_snippet: #include <iostream>
using namespace std;
int dir[] = { 0, 1, 0, -1 };
int H, W, a[109][109];
int main() {
	cin >> H >> W;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			cin >> a[i][j];
		}
	}
	int ret = 0;
	for (int i = 0; i < H * W; i++) {
		int pos = -1, r = -999999999;
		for (int j = 0; j < W; j++) {
			if (a[H - 1][j] == -1) continue;
			int res = 0;
			for (int k = 0; k < H; k++) {
				if (a[k][j] != -1) {
					if (a[k][j] == 1) res++;
					for (int l = 0; l < 4; l++) {
						int tx = k + dir[l], ty = j + dir[l ^ 1];
						if (0 <= tx && tx < H && 0 <= ty && ty < W) {
							if (a[tx][ty] == 1) res--;
							if (a[tx][ty] == 0) res++;
						}
					}
					break;
				}
			}
			if (r < res) {
				r = res;
				pos = j;
			}
		}
		for (int j = 0; j < H; j++) {
			if (a[j][pos] != -1) {
				ret += a[j][pos];
				a[j][pos] = -1;
				for (int k = 0; k < 4; k++) {
					int tx = j + dir[k], ty = pos + dir[k ^ 1];
					if (0 <= tx && tx < H && 0 <= ty && ty < W && a[tx][ty] != -1) {
						a[tx][ty] ^= 1;
					}
				}
				break;
			}
		}
	}
	cout << ret << endl;
	return 0;
}
accuracy: 0.09302325581395349
time_ms: 10
memory_kb: 3128
final_rank: 6

code_snippet: #include<iostream>
using namespace std;
int H, W, x[120][120];
int main() {
	for (int i = 0; i < 120; i++) { for (int j = 0; j < 120; j++)x[i][j] = 2; }
	cin >> H >> W; for (int i = 1; i <= H; i++) { for (int j = 1; j <= W; j++) { cin >> x[i][j]; } }
	int cnt = 0, e = 0;
	while (true) {
		if (e == H*W)break; e++;
		bool flag = false;
		for (int i = 1; i <= H; i++) {
			for (int j = 1; j <= W; j++) {
				if (flag == true)continue;
				if (x[i][j] == 1 && (x[i][j - 1] == 2 || x[i][j + 1] == 2) && x[i - 1][j] == 2) {
					cnt++; x[i][j] = 2;
					if (x[i - 1][j] != 2) { x[i - 1][j] = 1 - x[i - 1][j]; }
					if (x[i + 1][j] != 2) { x[i + 1][j] = 1 - x[i + 1][j]; }
					if (x[i][j - 1] != 2) { x[i][j - 1] = 1 - x[i][j - 1]; }
					if (x[i][j + 1] != 2) { x[i][j + 1] = 1 - x[i][j + 1]; }
					flag = true;
				}
			}
		}
		if (flag == true)continue;
		for (int i = 1; i <= H; i++) {
			for (int j = 1; j <= W; j++) {
				if (flag == true)continue;
				if (x[i][j] == 0 && (x[i][j - 1] == 2 || x[i][j + 1] == 2) && x[i - 1][j] == 2) {
					x[i][j] = 2;
					if (x[i - 1][j] != 2) { x[i - 1][j] = 1 - x[i - 1][j]; }
					if (x[i + 1][j] != 2) { x[i + 1][j] = 1 - x[i + 1][j]; }
					if (x[i][j - 1] != 2) { x[i][j - 1] = 1 - x[i][j - 1]; }
					if (x[i][j + 1] != 2) { x[i][j + 1] = 1 - x[i][j + 1]; }
					flag = true;
				}
			}
		}
	}
	cout << cnt << endl;
	return 0;
}
accuracy: 1
time_ms: 190
memory_kb: 3184
final_rank: 3

code_snippet: #include <bits/stdc++.h>
using namespace std;

#define rep(i,x,y) for(int i=(x);i<(y);++i)
#define mp(a,b) make_pair((a),(b))
#define debug(x) #x << "=" << (x)
 
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int,int> pii;
//template<typename T> using vec=std::vector<T>;

const int INF=1<<30;
const long long int INF_=1LL<<58;
const double EPS=1e-9;
const int dx[]={1,0,-1,0},dy[]={0,1,0,-1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec){
	os << "[";
	for (const auto &v : vec) {
		os << v << ",";
	}
	os << "]";
	return os;
}

int m,n,a[100][100],memo[100][101][101];

int DFS(int y,int l,int r){
	if(y==m) return 0;
	int &res=memo[y][l][r];
	if(res!=-1) return res;
	if(l==r) return res=DFS(y+1,0,n);

	res=max(res,DFS(y,l+1,r)+(a[y][l]+(y>0)+(l==0?0:1)+((r!=n)&&(r-l==1)))%2);
	res=max(res,DFS(y,l,r-1)+(a[y][r-1]+(y>0)+(r==n?0:1)+((l!=0)&&(r-l==1)))%2);
	return res;
}

void Solve(){
	cin >> m >> n;
	rep(i,0,m) rep(j,0,n) cin >> a[i][j];

	fill_n((int*)memo,100*101*101,-1);
	cout << DFS(0,0,n) << endl;
}

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	Solve();
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 6008
final_rank: 2

code_snippet: #include <bits/stdc++.h>
using namespace std;

#define rep(i,x,y) for(int i=(x);i<(y);++i)
#define mp(a,b) make_pair((a),(b))
#define debug(x) #x << "=" << (x)
 
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int,int> pii;
//template<typename T> using vec=std::vector<T>;

const int INF=1<<30;
const long long int INF_=1LL<<58;
const double EPS=1e-9;
const int dx[]={1,0,-1,0},dy[]={0,1,0,-1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec){
	os << "[";
	for (const auto &v : vec) {
		os << v << ",";
	}
	os << "]";
	return os;
}

int m,n,a[100][100],memo[100][100][101];

int DFS(int y,int l,int r){
	if(y==m) return 0;
	int &res=memo[y][l][r];
	if(res!=-1) return res;
	if(l==r) return res=DFS(y+1,0,n);

	res=max(res,DFS(y,l+1,r)+(a[y][l]+(y>0)+(l==0?0:1)+((r!=n)&&(r-l==1)))%2);
	res=max(res,DFS(y,l,r-1)+(a[y][r-1]+(y>0)+(r==n?0:1)+((l!=0)&&(r-l==1)))%2);
	return res;
}

void Solve(){
	cin >> m >> n;
	rep(i,0,m) rep(j,0,n) cin >> a[i][j];

	fill_n((int*)memo,100*100*101,-1);
	cout << DFS(0,0,n) << endl;
}

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	Solve();
	return 0;
}
accuracy: 0.20930232558139536
time_ms: 10
memory_kb: 5964
final_rank: 4

code_snippet: #include<stdio.h>
#include<algorithm>
using namespace std;
int p[100][100];
int m;
int dp[100][100];
int calc(int a,int b,int c){
	if(~dp[b][c])return dp[b][c];
	if(b==c){
		int ret=p[a][b];
		if(b==0)ret=!ret;
		if(b==m-1)ret=!ret;
		return dp[b][c]=ret;
	}
	return dp[b][c]=max(calc(a,b+1,c)+(((b==0&&p[a][b]==1)||(b!=0&&p[a][b]==0))?1:0),calc(a,b,c-1)+(((c==m-1&&p[a][c]==1)||(c!=m-1&&p[a][c]==0))?1:0));
}
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	m=b;
	for(int i=0;i<a;i++)
		for(int j=0;j<b;j++)
			scanf("%d",&p[i][j]);
	for(int i=1;i<a;i++)
		for(int j=0;j<b;j++)
			p[i][j]=!p[i][j];
	int ret=0;
	for(int i=0;i<a;i++){
		for(int k=0;k<100;k++)
			for(int j=0;j<100;j++)
				dp[k][j]=-1;
		ret+=calc(i,0,b-1);
	//	printf("%d\n",calc(i,0,b-1));
	}
	printf("%d\n",ret);
}
accuracy: 1
time_ms: 10
memory_kb: 1112
final_rank: 1

code_snippet: #include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;

map<pii,int> memo;

int h,w;
int c[110][110];

int rec(int x, int h1, int h2){
  if(h1==h && h2==h)return 0;
  if(memo.find(pii(h1,h2)) != memo.end())return memo[pii(h1,h2)];

  int res = 0;
  if(h1!=h){
    int tmp = rec(x,h1+1,h2);
    if( (h1>=h2)^(h1==0)^(x==0) )tmp += c[h1][x];
    else tmp += 1-c[h1][x];
    res = max(res,tmp);
  }
  if(h2!=h){
    int tmp = rec(x,h1,h2+1);
    if( (h1<=h2)^(h2==0)^(x+1==w-1) )tmp += c[h2][x+1];
    else tmp += 1-c[h2][x+1];
    res = max(res,tmp);
  }

  //cout << "[" << h1 << ", " << h2 << "]: " << res << endl;
  return memo[pii(h1,h2)] = res;
}
      
int main(){

  cin >> h >> w;
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++)cin >> c[i][j];
  }

  int ans = 0;
  if(w==1){
    for(int i=0;i<h;i++){
      if(i)ans += 1-c[i][0];
      else ans += c[i][0];
    }
    cout << ans << endl;
    return 0;
  }

  for(int k=0;k<w-1;k++){
    int num = 0;
    for(int i=0;i<w;i++){
      if(i==k || i==k+1)continue;
      for(int j=0;j<h;j++){
	if( (i==0||i==k-1)^(j==0) )num += 1-c[j][i];
	else num += c[j][i];
      }
    }

    memo.clear();
    //cout << num << " ";
    num += rec(k,0,0);
    //cout << num << endl;
    ans = max(ans,num);
  }

  cout << ans << endl;
}
accuracy: 0.09302325581395349
time_ms: 370
memory_kb: 1896
final_rank: 7

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
  
using namespace std;
  
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P> PP;
  
static const double EPS = 1e-8;
  
int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};

void print_stage(deque<bool> deq[101],int W,int H){
  for(int y=H-1;y>=0;y--){
    for(int x=0;x<W;x++){
      if(deq[x].size()-1 < y){
	printf(" ");
      }
      else{
	printf("%s",deq[x][y] ? "1" : "0");
      }
    }
    printf("\n");
  }
  printf("\n");
}

int dfs(deque<bool> deq[101],int W,int H){
  
  int res = 0;
  for(int x=0;x<W;x++){
    int y = deq[x].size()-1;
    if(y < 0) continue;

    bool is_erased = false;
    deque<bool> next[101];
    int count = 0;
    for(int i=0;i<W;i++) next[i] = deq[i];
    if(x-1 < 0) count++;
    if(x+1 >= W) count++;
    if(x-1 >= 0 && (deq[x-1].size()-1) < y) count++;
    if(x+1 < W && (deq[x+1].size()-1) < y) count++;

    bool is_sweet = false;
    if(count >= 1 && next[x].size() > 0){
      if(deq[x][deq[x].size()-1]) is_sweet = true;
      next[x].pop_back();
      is_erased = true;
    }
    
    for(int i=1;i<4;i++){
      int dx = x + tx[i];
      int dy = y + ty[i];
      if(dx < 0 || dx >= W || dy < 0 || dy >= H) continue;
      if(dy <= deq[dx].size()-1){
	next[dx][dy] = !deq[dx][dy];
      }
    }
    res = max(res,(is_sweet ? 1 : 0) + (is_erased ? dfs(next,W,H) : 0));
  }
  return res;
}

int main(){
  int H,W;
  while(~scanf("%d %d",&H,&W)){
    deque<bool> deq[101];
    for(int y=0;y<H;y++){
      for(int x=0;x<W;x++){
	int is_sweet;
	scanf("%d",&is_sweet);
	deq[x].push_front((bool)is_sweet);
      }
    }

    printf("%d\n",dfs(deq,W,H));
  }
}
accuracy: 0.09302325581395349
time_ms: 1180
memory_kb: 122240
final_rank: 8