題目大意 給出螺絲釘和匹配的螺絲帽每個大小爲pi
實際中螺絲釘可以與正負1的螺絲帽匹配。每次取出一個螺絲釘找一個匹配的螺絲帽匹配,問最後最多能剩下多少個不匹配的螺絲釘。
首先排序,然後DP,f[i]=max(f[j], calc(j+1,i))
calc(j+1,i)表示這段直接匹配最多多少個剩餘,貪心。枚舉扔掉最小的k個螺絲釘和k個最大的螺絲帽看是否情況成立。
兩端相鄰區間如果存在相互影響的部
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int cost[MAXN][MAXN];
int f[MAXN],p[MAXN];
int n;
int match(int L,int R)
{
if (abs(p[L]-p[R])<=1) return 0;
int ans = 0;
for (int k = 1;k<=R-L-1;++k)
{
bool can = true;
for (int i = L;i+k<=R;++i)
if (abs(p[i]-p[i+k])>1) can = false;
if ((abs(p[L+k-1]-p[R-k+1]) > 1) && can) ans = k;
}
return ans;
}
int main()
{
while (~scanf("%d",&n))
{
for (int i = 1 ; i <=n;++i) scanf("%d", &p[i]);
sort(p+1,p+n+1);
for (int i = 0 ; i <=n;++i) f[i] = 0;
for (int i = 1 ; i <=n;++i)
for (int j = i;j <=n;++j) cost[i][j] = match(i,j);
for (int i = 1; i <=n;++i)
for (int j = 0;j<i;++j) f[i]=max(f[i],f[j]+cost[j+1][i]);
cout << f[n] << endl;
}
return 0;
}
分,則可以通過調整改變。