题目连接:http://acm.fjnu.edu.cn/show?problem_id=1772
中文题,赤裸裸的dp,但是还是在别人的提醒下才a掉的。。郁闷。。。
dp[i][j]以i结尾,表示前i个元素留下j个元素,那么前面i-1个元素留下j-1个元素。
那么状态方程为:dp[i][j]={dp[k][j-1]+abs(data[i].y-data[k].y)};
那么初始化:dp[i][0]=dp[i][1]=0;
清清楚楚的dp;
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
#define inf 9999999
#define N 105
#define M 105
int dp[N][M],n,m;
struct Node
{
int x,y;
bool operator<(const Node & a) const
{
return x<a.x;
}
} data[N];
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
int tmp;
for(int i=1;i<=n;i++)
scanf("%d%d",&data[i].x,&data[i].y);
sort(data+1,data+n+1);
for(int i=0;i<=n;i++)
for(int j=0;j<=n-m;j++)
dp[i][j]=inf;
for(int i=0;i<=n;i++) dp[i][0]=dp[i][1]=0;
for(int i=2;i<=n;i++)
{
for(int j=2;j<=n-m;j++)
{
tmp=inf;
for(int k=j-1;k<i;k++)
{
tmp=min(tmp,dp[k][j-1]+abs(data[i].y-data[k].y));
}
dp[i][j]=tmp;
}
}
tmp=inf;
for(int i=0;i<=n;i++)
if(dp[i][n-m]<tmp) tmp=dp[i][n-m];
printf("%d/n",tmp);
}
return 0;
}