Problem:
Problem F: KULASIS

Description

　KULASISとは，全学共通科目に関する情報をWeb化し，学生・教員への支援やサービスの向上を目的に，高等教育研究開発推進機構で開発・運用しているシステムの名称です。　KULASISは2003年度のオンラインシラバス開発から始まり，Web掲示板・履修登録・成績関係（採点登録・学生からの採点確認）と順次システムを拡充してきました。

　学生はパソコン・携帯電話から学内外を問わず，教務情報（休講・授業変更・レポート）の確認・履修登録・採点確認等の機能を利用することができます。ログイン件数は多い日には10,000件を超え，京都大学の教務情報システムとして浸透し，全学共通科目を履修するためには欠かせないものとなっています。このKULASISを全学共通科目のみにとどまらず，学部専門課程や大学院にも適用できるよう 開発を進めています。

http://www.z.k.kyoto-u.ac.jp/introduction_kulasis.html

京大生のQは後期のシラバスを組むためにKULASISにログインしていた．
どの科目を入れようとしているか悩んでいると，突然KULASISが眩い光を放ち，別のページへと遷移した．

遷移した先のページは下図のようなものであった．5x5のマスには科目名と評価(不可，可，良，優)が書かれており，格子上には●のボタンが16個配置されている．

いったいなにが起きたのか分からなかったQだったが，どうやら格子上にある●のボタンを押すと，その右上，右下，左上，左下にあるマスの科目の評価がそれぞれ 不可→可，可→良，良→優，優→不可 と入れ替わるようであった．

●のボタンは何度でも押すことができる．

KULASISが何者かによって書き換えられてしまったのか自分が夢を見ているのかよく分からないが，これで成績を確定できるならば，出来るだけ良い成績を得たいとQは考えた．

単位を多く集めていることに自信があったQは，単位の数そのものよりも半年後の研究室配属に備えて戦闘力を最大にさせることにした．

戦闘力とは各科目の評価を，不可→0点，可→60点，良→70点，優→80点と換算して合計した値のことで，これは研究室配属の際に自分がどの程度優位なのかを表すと(Qの学科では)思われている．

いま，KULASISの画面の表示されている科目とその評価が与えられるので，得ることが出来る戦闘力の最大値を出力するプログラムを記してほしい．

Input

入力の1行目にはテストケースの個数が与えられる．テストケースの数は100個以下であることが保障されている．

2行目以降は5x5の数字が並び，KULASISの画面に表示されている科目の評価が与えられ，1,2,3,4がそれぞれ不可，可，良，優に対応する．

0ならばそのコマには科目は登録されていない．

テストケース同士の間は空行で区切られている．

Output

各テストケースに対し，得ることの出来る戦闘力の最大値を出力せよ．

Sample Input

5

1 1 0 3 3
1 1 0 3 3
0 0 0 0 0
2 2 0 4 4
2 2 0 4 4

1 1 1 0 0
1 1 1 1 0
1 0 1 1 0
0 0 1 1 1
1 1 1 1 1

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

4 3 4 3 4
3 4 3 4 3
4 3 4 3 4
3 4 3 4 3
4 3 4 3 4

2 2 2 2 2
0 0 0 2 0
2 2 0 2 0
2 2 0 2 0
0 0 0 2 0

Output for Sample Input

1280
1420
0
1920
1020

Solution in C++ (judge verdict: Accepted)

#include<cstdio>
#include<algorithm>

using namespace std;

const int inf=1<<29;
int memo[6][4][4][4][4];

int main(){
	const int score[]={0,60,70,80};

	int t;	scanf("%d",&t);
	while(t--){
		int field[5][5];
		for(int i=0;i<5;i++)for(int j=0;j<5;j++)	scanf("%d",field[i]+j);

		for(int i=0;i<4;i++)for(int j=0;j<4;j++)for(int k=0;k<4;k++)for(int l=0;l<4;l++)
			memo[0][i][j][k][l]=-inf;
		memo[0][0][0][0][0]=0;

		for(int row=1;row<=5;row++){
			for(int i=0;i<4;i++)for(int j=0;j<4;j++)for(int k=0;k<4;k++)for(int l=0;l<4;l++){
				memo[row][i][j][k][l]=-inf;
				for(int p=0;p<4;p++)for(int q=0;q<4;q++)for(int r=0;r<4;r++)for(int s=0;s<4;s++){
					int cnt[5]={};
					cnt[0]=i+p;
					cnt[1]=i+j+p+q;
					cnt[2]=j+k+q+r;
					cnt[3]=k+l+r+s;
					cnt[4]=l+s;
					int rowscore=0;
					for(int m=0;m<5;m++){
						if(field[row-1][m]>0)	rowscore+=score[(field[row-1][m]-1+cnt[m])&3];
					}
					memo[row][i][j][k][l]=max(memo[row][i][j][k][l],
						memo[row-1][p][q][r][s]+rowscore);
				}
			}
		}

		printf("%d\n",memo[5][0][0][0][0]);
	}

	return 0;
}