dp好题
#line 2 "Wardrobe.cpp"
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;
#define INF 2100000000
#define PB push_back
#define MP make_pair
#define abs(x) ((x)>0?(x):(-(x)))
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;
#define MAXN 105
class Wardrobe
{
public:
int cost[MAXN][MAXN];
int f[MAXN],n;
int match(int l,int r,vector<int> p)
{
int ans=0;
if (p[r]-p[l]<=1) return 0;
for (int k=1;k<=r-l-1;++k)
{
int flag=1;
for (int i=l;i+k<=r;++i)
if (p[i+k]-p[i]>1) flag=false;
if (abs(p[r-k+1]-p[l+k-1])>1&&flag) ans=k;
}
return ans;
}
int countUnscrewedHoles(vector <int> bolts)
{
memset(cost,0,sizeof cost);
memset(f,0,sizeof f);
n=(int)bolts.size();
sort(bolts.begin(),bolts.end());
for (int i=0;i<n;++i)
for (int j=i;j<n;++j) cost[i][j]=match(i,j,bolts);
f[0]=0;
for (int i=1;i<n;++i)
{
for (int j=i-1;j>=0;--j) f[i]=max(f[i],f[j]+cost[j+1][i]);
f[i]=max(f[i],cost[0][i]);
}
return f[n-1];
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
int main()
{
int n;
vector<int> a;
Wardrobe ___test;
while (scanf("%d",&n)==1)
{
a.clear();
for (int i=1;i<=n;++i)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
cout<<___test.countUnscrewedHoles(a)<<endl;
}
return 0;
}
// END CUT HERE