Language: C++

//g++ -std=c++14 test.cpp -o test.out
//問題URL
//https://atcoder.jp/contests/abc147/tasks/abc147_e
//bitset<100> bなどと定義すると、長さ100の0 or 1の列を確保できる
//これに対してbit演算も可能
//ちなみにbitset<n>のnはコンパイル時に決まっている必要あり
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <cassert>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <vector>
#include <queue>
#include <map> 
#include <utility>
#include <limits.h>
using namespace std;
 
#define LL long long int
const LL INF = (LL)(1e18)+1;
const LL mod = 1000000007ll;

int H,W;
int A[80][80];

int ans = 2147483647;

void solve(){
	const int standard = 80*80*2;
	const int bitset_size = standard*2+1;
	vector<vector<bitset<bitset_size>>> dp(80,vector<bitset<bitset_size>>(80,0));//x,yまできたときに和がjであることが可能かどうかをdp[x][y][j]とおく
	//jのとりうる値は-80*80*2 ~ 80*80*2;
	dp[0][0][standard-A[0][0]] = 1;
	dp[0][0][standard+A[0][0]] = 1;
	for(int h=0;h<H;h++){
		for(int w=0;w<W;w++){
			//上から下への遷移
			if(h){
				//例えばdp[i-1][j] = 01011000
				//左から順に(i-1,j)で計算した後に0,1,2,3,4,5,6,7になることが可能かどうかを表している
				//としたとき
				//例えばa[i][j]=2であれば
				//dp[i][j] = dp[i-1][j] >> 2を計算し
				//dp[i][j] = 00010110
				//左から順に(i,j)で計算した後に0,1,2,3,4,5,6,7になることが可能かどうかを表している
				// << 2についても計算しOR(|)をとって保管
				dp[h][w] |= dp[h-1][w] << A[h][w];
				dp[h][w] |= dp[h-1][w] >> A[h][w];
			}
			//左から右への遷移
			if(w){
				dp[h][w] |= dp[h][w-1] << A[h][w];
				dp[h][w] |= dp[h][w-1] >> A[h][w];
			}
		}
	}
	for(int i=0;i<bitset_size;i++){
		if(dp[H-1][W-1][i]) ans = min(ans,abs(i-standard));
	}
}
 
int main(){
	cin >> H >> W;
	for(int i=0;i<H;i++){
		for(int j=0;j<W;j++) cin >> A[i][j];
	}
	for(int i=0;i<H;i++){
		for(int j=0;j<W;j++){
			int x;
			cin >> x;
			A[i][j] = abs(A[i][j]-x);
		}
	}
 
	solve();

	cout << ans << endl;
	return 0;
}

Compiler output:
a.cc: In function 'void solve()':
a.cc:34:23: error: 'bitset' was not declared in this scope
   34 |         vector<vector<bitset<bitset_size>>> dp(80,vector<bitset<bitset_size>>(80,0));//x,yまできたときに和がjであることが可能かどうかをdp[x][y][j]とおく
      |                       ^~~~~~
a.cc:20:1: note: 'std::bitset' is defined in header '<bitset>'; this is probably fixable by adding '#include <bitset>'
   19 | #include <limits.h>
  +++ |+#include <bitset>
   20 | using namespace std;
a.cc:34:30: error: template argument 1 is invalid
   34 |         vector<vector<bitset<bitset_size>>> dp(80,vector<bitset<bitset_size>>(80,0));//x,yまできたときに和がjであることが可能かどうかをdp[x][y][j]とおく
      |                              ^~~~~~~~~~~
a.cc:34:30: error: template argument 2 is invalid
a.cc:34:41: error: template argument 1 is invalid
   34 |         vector<vector<bitset<bitset_size>>> dp(80,vector<bitset<bitset_size>>(80,0));//x,yまできたときに和がjであることが可能かどうかをdp[x][y][j]とおく
      |                                         ^~
a.cc:34:41: error: template argument 2 is invalid
a.cc:34:43: error: expected unqualified-id before '>' token
   34 |         vector<vector<bitset<bitset_size>>> dp(80,vector<bitset<bitset_size>>(80,0));//x,yまできたときに和がjであることが可能かどうかをdp[x][y][j]とおく
      |                                           ^
a.cc:36:9: error: 'dp' was not declared in this scope
   36 |         dp[0][0][standard-A[0][0]] = 1;
      |         ^~