比赛 20101101 评测结果 AAAAAAAAAA
题目名称 奇怪的监狱 最终得分 100
用户昵称 苏轼 运行时间 0.014 s
代码语言 C++ 内存使用 3.19 MiB
提交时间 2012-11-05 11:01:46
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m,q[105][105]={0};
int w[105]={0};
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
int main()
{
	freopen ("prison.in","r",stdin);
	freopen ("prison.out","w",stdout);
	cin>>n>>m;
	for (int i=1;i<=m;i++)
	{
		cin>>w[i];
	}
	w[0]=0;
	w[m+1]=n+1;
	qsort(w,m+2,sizeof(w[0]),cmp);
	for (int i=0;i<=m+1;i++)
		for (int j=i;j<=m+1;j++)
			q[i][j]=9999999;
	for (int i=0;i<m+1;i++)
	{
		q[i][i+1]=w[i+1]-w[i]-1;
	}
	for (int i=0;i<m;i++)
	{
		q[i][i+2]=w[i+2]-w[i]-2;
	}
	for (int j=3;j<=m+1;j++)
	{
		for (int i=0;i<m;i++)
		{
			if (i+j>m+1)
				break;
			for (int k=i+1;k<i+j;k++)
			{
				if (k==i+1)
				{
					q[i][i+j]=min(q[i][i+j],q[k][i+j]+w[i+j]-w[i]-2);
					continue;
				}
				if (k==i+j-1)
				{
					q[i][i+j]=min(q[i][i+j],q[i][k]+w[i+j]-w[i]-2);
					continue;
				}
				q[i][i+j]=min(q[i][i+j],q[i][k]+q[k][i+j]+w[i+j]-w[i]-2);
			}
		}
	}
	cout<<q[0][m+1];
	return 0;
}