Language: C++

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int dp[1<<5][1<<5][1<<5][1<<5][1<<5];
bool passed[1<<5][1<<5][1<<5][1<<5][1<<5];

int n;
int field[5][5];
	
const int INF=1000000;

int dfs(int s1,int s2,int s3,int s4,int s5){
	if(!s1&&!s2&&!s3&&!s4&&!s5){
		return 0;
	}
	if(dp[s1][s2][s3][s4][s5]!=0)
		return dp[s1][s2][s3][s4][s5];

	int minRet=INF;
	
	// é`¶ãÌÀW
	for(int miny = 0; miny < n; miny++){
		for(int minx= 0; minx < n; minx++){
			// é`EºÌÀW
			for(int maxy = miny; maxy < n; maxy++){
				for(int maxx = minx; maxx < n; maxx++){
					int ns[5];
					ns[0] = s1;
					ns[1] = s2;
					ns[2] = s3;
					ns[3] = s4;
					ns[4] = s5;
					// èµ½ÍÍÌrbgð½]·é
					for(int i = miny; i <= maxy; i++){
						for(int j = minx; j <= maxx; j++){
							if(((ns[i] >> j) & 1)){
								ns[i] &= ~(1 << j);
							}
							else{
								ns[i] |= (1<<j);
							}
						}
					}
					// ÄA
					if(passed[ns[0]][ns[1]][ns[2]][ns[3]][ns[4]])
						continue;
					passed[ns[0]][ns[1]][ns[2]][ns[3]][ns[4]]=true;
					if(ns[0]==0){
					//	cout<<endl;
					}
					minRet=min(minRet,1+dfs(ns[0],ns[1],ns[2],ns[3],ns[4]));
					passed[ns[0]][ns[1]][ns[2]][ns[3]][ns[4]]=false;
				}
			}
		}
	}

	dp[s1][s2][s3][s4][s5]=minRet;
	return minRet;
	//if(n==1){
	//	return 1;
	//}
	//else if(n==2){
	//	return 1;
	//}
	//else if(n==3){
	//	if(s1==0&&s2==0&&s3==0)
	//		return 0;
	//	if(dp[s1][s2][s3][0][0]!=INF)
	//		return dp[s1][s2][s3][0][0];
	//	// ñÊèÌû@ª é
	//	int ns1 = s1;
	//	int ns2 = s2;
	//	int ns3 = s3;
	//	
	//	for(int i = 0; i < 3; i++){
	//		if(((s1 >> i) & 1)){
	//			ns1 &= ~(1 << i);
	//		}
	//		else{
	//			ns1 |= (1<<i);
	//		}
	//		if(((s2 >> i) & 1)){
	//			ns2 &= ~(1 << i);
	//		}
	//		else{
	//			ns2 |= (1<<i);
	//		}
	//		if(((s3 >> i) & 1)){
	//			ns3 &= ~(1 << i);
	//		}
	//		else{
	//			ns3 |= (1<<i);
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,0,0));
	//	ns1=s1;ns2=s2;ns3=s3;
	//	for(int i = 0; i < 3; i++){
	//		if(i == 1){
	//			if(((s2 >> i) & 1)){
	//				ns2 &= ~(1 << i);
	//			}
	//			else{
	//				ns2 |= (1<<i);
	//			}
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,0,0));
	//	dp[s1][s2][s3][0][0]=minRet;
	//	return minRet;
	//}
	//else if(n==4){
	//	if(s1==0&&s2==0&&s3==0&&s4==0)
	//		return 0;
	//	if(dp[s1][s2][s3][s4][0]!=INF)
	//		return dp[s1][s2][s3][s4][0];
	//	// ñÊèÌû@ª é
	//	int ns1 = s1;
	//	int ns2 = s2;
	//	int ns3 = s3;
	//	int ns4 = s4;
	//	
	//	for(int i = 0; i < 4; i++){
	//		if(((s1 >> i) & 1)){
	//			ns1 &= ~(1 << i);
	//		}
	//		else{
	//			ns1 |= (1<<i);
	//		}
	//		if(((s2 >> i) & 1)){
	//			ns2 &= ~(1 << i);
	//		}
	//		else{
	//			ns2 |= (1<<i);
	//		}
	//		if(((s3 >> i) & 1)){
	//			ns3 &= ~(1 << i);
	//		}
	//		else{
	//			ns3 |= (1<<i);
	//		}
	//		if(((s4 >> i) & 1)){
	//			ns4 &= ~(1 << i);
	//		}
	//		else{
	//			ns4 |= (1<<i);
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,ns4,0));
	//	ns1=s1;ns2=s2;ns3=s3;ns4=s4;
	//	for(int i = 0; i < 4; i++){
	//		if(i == 1 || i == 2){
	//			if(((s2 >> i) & 1)){
	//				ns2 &= ~(1 << i);
	//			}
	//			else{
	//				ns2 |= (1<<i);
	//			}
	//			if(((s3 >> i) & 1)){
	//				ns3 &= ~(1 << i);
	//			}
	//			else{
	//				ns3 |= (1<<i);
	//			}
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,ns4,0));
	//	dp[s1][s2][s3][ns4][0]=minRet;
	//	return minRet;
	//}
	//else if(n==5){
	//	if(s1==0&&s2==0&&s3==0&&s4==0&&s5==0)
	//		return 0;
	//	if(dp[s1][s2][s3][s4][s5]!=INF)
	//		return dp[s1][s2][s3][s4][s5];
	//	// OÊèÌû@ª é
	//	int ns1 = s1;
	//	int ns2 = s2;
	//	int ns3 = s3;
	//	int ns4 = s4;
	//	int ns5 = s5;
	//	
	//	for(int i = 0; i < 5; i++){
	//		if(((s1 >> i) & 1)){
	//			ns1 &= ~(1 << i);
	//		}
	//		else{
	//			ns1 |= (1<<i);
	//		}
	//		if(((s2 >> i) & 1)){
	//			ns2 &= ~(1 << i);
	//		}
	//		else{
	//			ns2 |= (1<<i);
	//		}
	//		if(((s3 >> i) & 1)){
	//			ns3 &= ~(1 << i);
	//		}
	//		else{
	//			ns3 |= (1<<i);
	//		}
	//		if(((s4 >> i) & 1)){
	//			ns4 &= ~(1 << i);
	//		}
	//		else{
	//			ns4 |= (1<<i);
	//		}
	//		if(((s5 >> i) & 1)){
	//			ns5 &= ~(1 << i);
	//		}
	//		else{
	//			ns5 |= (1<<i);
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,ns4,ns5));
	//	ns1=s1;ns2=s2;ns3=s3;ns4=s4;ns5=s5;
	//	for(int i = 0; i < 5; i++){
	//		if(i != 0 && i != 4){
	//			if(((s2 >> i) & 1)){
	//				ns2 &= ~(1 << i);
	//			}
	//			else{
	//				ns2 |= (1<<i);
	//			}
	//			if(((s4 >> i) & 1)){
	//				ns4 &= ~(1 << i);
	//			}
	//			else{
	//				ns4 |= (1<<i);
	//			}
	//		}
	//		if(i == 1 || i == 3 || i == 2){
	//			if(((s3 >> i) & 1)){
	//				ns3 &= ~(1 << i);
	//			}
	//			else{
	//				ns3 |= (1<<i);
	//			}
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,ns4,ns5));
	//	ns1=s1;ns2=s2;ns3=s3;ns4=s4;ns5=s5;
	//	for(int i = 0; i < 5; i++){
	//		if(i == 2){
	//			if(((s3 >> i) & 1)){
	//				ns3 &= ~(1 << i);
	//			}
	//			else{
	//				ns3 |= (1<<i);
	//			}
	//		}
	//	}
	//	minRet=min(minRet,1+dfs(ns1,ns2,ns3,ns4,ns5));
	//	dp[s1][s2][s3][ns4][ns5]=minRet;
	//	return minRet;
	//}
}

int main(){

	while(cin>>n&&n!=0){

		int s[5];
		s[0]=s[1]=s[2]=s[3]=s[4]=0;
		for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++){
				cin>>field[i][j];
				if(field[i][j]){
					s[i] |= (1 << j);
				}
			}
		}
		memset(dp,0,sizeof(dp));
		memset(passed,0,sizeof(passed));

		passed[s[0]][s[1]][s[2]][s[3]][s[4]]=true;
		cout<<dfs(s[0],s[1],s[2],s[3],s[4])<<endl;
	}

	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:276:17: error: 'memset' was not declared in this scope
  276 |                 memset(dp,0,sizeof(dp));
      |                 ^~~~~~
a.cc:4:1: note: 'memset' is defined in header '<cstring>'; this is probably fixable by adding '#include <cstring>'
    3 | #include <vector>
  +++ |+#include <cstring>
    4 |