比赛 |
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;
}