比赛 20120709 评测结果 AAAAAAAAAA
题目名称 磁性链 最终得分 100
用户昵称 Citron酱 运行时间 0.006 s
代码语言 C++ 内存使用 0.29 MiB
提交时间 2012-07-09 11:33:40
显示代码纯文本
#include <cstdio>
#include <climits>

#define I_F "linka.in"
#define O_F "linka.out"

const int MAXq=100+2;

int n, q;
int p[MAXq], s[MAXq];
int ans;

void Input();
template<typename Any>
inline void Swap(Any&, Any&);
void Sort();
void Prework();
inline int Min(const int&, const int&);
void Dynap();
void Output();

int main()
{
	Input();
	Sort();
	Prework();
	Dynap();
	Output();
	return 0;
}

void Input()
{
	freopen(I_F,"r",stdin);
	scanf("%d%d",&n,&q);
	for (int i=0; i<q; ++i)
		scanf("%d",&p[i]);
}

template<typename Any>
inline void Swap(Any &a, Any &b)
{
	Any t=a;
	a=b;
	b=t;
}

void Sort()
{
	for (int i=0; i<q; ++i)
		for (int j=q-1; j>i; --j)
			if (p[j]<p[j-1])
				Swap(p[j],p[j-1]);
}

void Prework()
{
	s[0]=0;
	for (int i=1; i<=q; ++i)
		s[i]=p[i-1]-i;
	s[q+1]=n-q;
}

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

void Dynap()
{
	int r;
	int f[MAXq][MAXq]={{0}};
	for (int i=2; i<=q+1; ++i)
		for (int j=1; j<=q-i+2; ++j)
		{
			r=j+i-1;
			f[j][r]=INT_MAX;
			for (int k=j; k<r; ++k)
				f[j][r]=Min(f[j][r],f[j][k]+f[k+1][r]);
			f[j][r]+=s[r]-s[j-1]+i-2;
		}
	ans=f[1][q+1];
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%d\n",ans);
}