比赛 20101101 评测结果 AAAAAAAAAA
题目名称 奇怪的监狱 最终得分 100
用户昵称 Makazeu 运行时间 0.014 s
代码语言 C++ 内存使用 9.76 MiB
提交时间 2012-11-05 08:55:21
显示代码纯文本
/*
* Problem : 奇怪的监狱 prison
* Author  : Makazeu@gmail.com
* Method  : Dynamic Programming
* Submit@ : COGS 488
*/
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MAXN=1011;
const int INF=(~0u>>2)-2;
int N,M,Num[MAXN],T,Ans;
int F[MAXN][MAXN],A[MAXN],Sum[MAXN][MAXN]={0};

inline void init()
{
	scanf("%d %d\n",&N,&M);
	for(int i=1;i<=M;i++) 
		scanf("%d",&Num[i]);
	sort(Num+1,Num+1+M);
	Num[0]=0,Num[M+1]=N+1; T=M+1;
	for(int i=1;i<=M+1;i++)
	{
		if((Num[i]-1)<(Num[i-1]+1)) continue;
		A[i]=Num[i]-Num[i-1]-1;
	}
	for(int i=1;i<=T;i++)
		for(int j=1;j<=T;j++)
			F[i][j]=INF;
	for(int i=1;i<=T;i++)
	{
		F[i][i]=0,Sum[i][i]=A[i];
		for(int j=i+1;j<=T;j++)
			Sum[i][j]=Sum[i][j-1]+A[j];
	}
}

inline int Min(int a,int b) {return a<b?a:b;}
inline void dp()
{
	for(int len=2;len<=T;len++)
	{
		for(int i=1;i<=T-len+1;i++)
		{
			int j=i+len-1;
			for(int k=i;k<=j-1;k++)
			{
				F[i][j]=Min(F[i][j],F[i][k]+F[k+1][j]+Sum[i][j]-i+j-1);
			}
		}
	}
	Ans=F[1][T];
	printf("%d\n",Ans);
}

int main()
{
	freopen("prison.in","r",stdin);
	freopen("prison.out","w",stdout);
	init();
	dp();
	return 0;
}