比赛 20150423 评测结果 AAAAAAAAAAAAAAA
题目名称 马拉松2 最终得分 100
用户昵称 cstdio 运行时间 1.152 s
代码语言 C++ 内存使用 3.29 MiB
提交时间 2015-04-23 08:30:57
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<cstdlib>
using namespace std;
const int SIZEN=510;
int N,K;
int x[SIZEN],y[SIZEN];
int dis[SIZEN][SIZEN];
int F[2][SIZEN][SIZEN];
void update(int &a,int b){
	if(a==-1||b<a) a=b;
}
void work(void){
	memset(F,-1,sizeof(F));
	int k=0;
	F[k][1][0]=0;
	for(int i=2;i<=N;i++){
		memset(F[k^1],-1,sizeof(F[0]));
		for(int j=1;j<i;j++){//此前走到了j
			for(int d=0;d<=K;d++){//此前跳过了d个
				if(F[k][j][d]==-1) continue;
				//情况1:走i
				update(F[k^1][i][d],F[k][j][d]+dis[j][i]);
				//情况2:跳过i
				if(d+1<=K) update(F[k^1][j][d+1],F[k][j][d]);
			}
		}
		k^=1;
	}
	int ans=-1;
	for(int d=0;d<=K;d++){
		update(ans,F[k][N][d]);
	}
	printf("%d\n",ans);
}
void read(void){
	scanf("%d%d",&N,&K);
	for(int i=1;i<=N;i++) scanf("%d%d",&x[i],&y[i]);
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			dis[i][j]=abs(x[i]-x[j])+abs(y[i]-y[j]);
		}
	}
}
int main(){
	freopen("marathonb.in","r",stdin);
	freopen("marathonb.out","w",stdout);
	read();
	work();
	return 0;
}