比赛 20120709 评测结果 AAAAAAAAAA
题目名称 磁性链 最终得分 100
用户昵称 Makazeu 运行时间 0.004 s
代码语言 C++ 内存使用 0.34 MiB
提交时间 2012-07-09 11:51:20
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int N,Q,M,Num[111],F[111][111],S[111]={0};

inline void init()
{
	scanf("%d %d\n",&N,&Q);
	for(int i=1;i<=Q;i++) scanf("%d\n",&Num[i]);
	sort(Num+1,Num+Q+1); M=Q+1; 
	for(int i=1;i<=Q;i++) S[i]=Num[i]-Num[i-1]-1;
	S[M]=N-Num[Q];	for(int i=1;i<=M;i++) S[i]+=S[i-1];
}

inline int Min(int a,int b) 
{
	return a<b?a:b;
}

inline void dp()
{
	for(int i=1;i<=M;i++)
		for(int j=1;j<=M;j++)
			F[i][j]=10000000;
	for(int i=1;i<=M;i++) F[i][i]=0;	
	
	for(int i=M;i>=1;i--)
	{
		for(int j=i+1;j<=M;j++)
		{
			for(int k=i;k<=j-1;k++)
			{
				F[i][j]=Min(F[i][j],F[i][k]+F[k+1][j]+S[j]-S[i-1]+j-i-1);
			}
		}
	}
	/*
	for(int i=1;i<=M;i++)
	{
		printf("%d--->%d--> ",i,S[i]);
		for(int j=1;j<=M;j++)
			printf("%d ",F[i][j]);
		printf("\n");
	}*/
	printf("%d\n",F[1][M]);
}

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