记录编号 337398 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 __围栏问题 最终得分 100
用户昵称 GravatarTenderRun 是否通过 通过
代码语言 C++ 运行时间 8.512 s
提交时间 2016-11-04 13:15:10 内存使用 4.56 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>

//#include <ctime>

using namespace std;
const int N=17,INF=10000;
int n,m,k,x[N],y[N];
int dp[1<<16][17];
int x1,y1,x2,y2;
int main(){
  freopen("xfence.in","r",stdin);
  freopen("xfence.out","w",stdout);
  scanf("%d%d%d",&m,&k,&n);
  for(register int i=1;i<=n;i++)
    scanf("%d%d",&x[i],&y[i]);
  memset(dp,63,sizeof(dp));
  for(register int s=0;s<1<<n;s++){
    x1=INF,y1=INF;
    x2=-INF,y2=-INF;
    for(register int i=1;i<=n;i++)
      if((s>>(i-1))&1){
	x1=min(x1,x[i]);
	y1=min(y1,y[i]);
	x2=max(x2,x[i]);
	y2=max(y2,y[i]);
      }
    dp[s][1]=2*(x2-x1+y2-y1+2);
  }memset(dp[0],0,sizeof(dp[0]));
  //printf("%.3f\n",1.0*clock()/CLOCKS_PER_SEC);
  for(register int s=0;s<1<<n;s++){
    for(register int p=s-1;~p;p--){
      p&=s;
      for(register int t=2;t<=k;t++)
	if(dp[s][t]>dp[p][1]+dp[s^p][t-1])
	  dp[s][t]=dp[p][1]+dp[s^p][t-1];
    }
  }
  printf("%d\n",dp[(1<<n)-1][k]);
  //printf("%.3f\n",1.0*clock()/CLOCKS_PER_SEC);
  return 0;
}