Skip to content

Instantly share code, notes, and snippets.

@takageymt
Created March 9, 2017 02:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save takageymt/c7b7b229871b2c912c5b2d319d5f5987 to your computer and use it in GitHub Desktop.
Save takageymt/c7b7b229871b2c912c5b2d319d5f5987 to your computer and use it in GitHub Desktop.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define all(v) begin(v), end(v)
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define reps(i, s, n) for(int i = (int)(s); i < (int)(n); i++)
#define min(...) min({__VA_ARGS__})
#define max(...) max({__VA_ARGS__})
template<class T1, class T2> void chmin(T1 &a, T2 b){if(a>b)a=b;}
template<class T1, class T2> void chmax(T1 &a, T2 b){if(a<b)a=b;}
using pint = pair<int, int>;
using tint = tuple<int, int, int>;
using vint = vector<int>;
const int inf = 1LL << 55;
const int mod = 1e9 + 7;
map<tuple<int, int, int, int>, int> dp;
int W, H, N, X[33], Y[33];
int solve(int lx, int ly, int rx, int ry) {
if(dp.count(tie(lx, ly, rx, ry))) return dp[tie(lx, ly, rx, ry)];
int res = 0;
rep(i, N) {
if(lx <= X[i] && X[i] < rx && ly <= Y[i] && Y[i] < ry) {
int lu = solve(lx, ly, X[i], Y[i]);
int ld = solve(lx, Y[i]+1, X[i], ry);
int ru = solve(X[i]+1, ly, rx, Y[i]);
int rd = solve(X[i]+1, Y[i]+1, rx, ry);
chmax(res, lu+ld+ru+rd+(rx-lx)+(ry-ly)-1);
}
}
return dp[tie(lx, ly, rx, ry)] = res;
}
signed main()
{
cin.tie(0);
ios_base::sync_with_stdio(0);
cout << fixed << setprecision(12);
cin >> W >> H >> N;
rep(i, N) cin >> X[i] >> Y[i], X[i]--, Y[i]--;
cout << solve(0, 0, W, H) << endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment