SRM 308 Wardrobe

題目大意  給出螺絲釘和匹配的螺絲帽每個大小爲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;
}

分,則可以通過調整改變。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章