比赛 20150423 评测结果 AAAAAAAAAAAAAAA
题目名称 马拉松2 最终得分 100
用户昵称 清羽 运行时间 0.210 s
代码语言 C++ 内存使用 1.47 MiB
提交时间 2015-04-23 09:59:35
显示代码纯文本
/*
动态规划问题
状态定义:d[i][j]表示阶段i,最多跳j个点所能取得的最小行程
          请注意:最后一个点(即点i)不能跳
状态转移方程:d[i][j]=min(d[i-k-1][j-k]+dist[i-k-1][i])
			  (0<=k<=min(j,i-1))
边界:d[0][j]=0
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<ctime>
#include<algorithm>
using namespace std;

const int maxn=550;
const int INF=2147483647;

char buf[40];
int n,tot,d[maxn][maxn],x[maxn],y[maxn];

template<class T> inline bool getd(T& x)
{
	int ch=getchar();
	bool neg=false;
	while(ch!=EOF && ch!='-' && !isdigit(ch)) ch=getchar();
	if(ch==EOF) return false;
	if(ch=='-'){
		neg=true;
		ch=getchar();
	}
	x=ch-'0';
	while(isdigit(ch=getchar())) x=x*10+ch-'0';
	if(neg) x=-x;
	return true;
}

template<class M> inline void putd(M x)
{
	int p=0;
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x==0) buf[p++]=x;
	while(x){
		buf[p++]=x%10;
		x/=10;
	}
	for(int i=p-1;i>=0;i--) putchar(buf[i]+'0');
	putchar('\n');
}

int dist(int i,int j)
{
	return abs(x[i]-x[j])+abs(y[i]-y[j]);
}

void init()
{
	getd(n);getd(tot);
	for(int i=0;i<n;i++){
		getd(x[i]);
		getd(y[i]);
	}
}

void work()
{
	for(int i=0;i<=tot;i++) d[0][i]=0;
	for(int i=1;i<n;i++)
	    for(int j=0;j<=tot;j++){
			d[i][j]=INF;
			for(int k=0;k<=min(j,i-1);k++)
			d[i][j]=min(d[i][j],d[i-k-1][j-k]+dist(i-k-1,i));
	    }
	putd(d[n-1][tot]);
}

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