今天最简单的一个题,DP做就好。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
const int maxn=501;
int n,k;
int dp[2][501];
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
int cur=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<k;i++)
{
int ita;
scanf("%d",&ita);
dp[cur][ita]=1;
}
for(int i=1;i<n;i++)
{
cur=1-cur;
memset(dp[cur],0,sizeof(dp[cur]));
for(int j=0;j<k;j++)
{
int ita;
scanf("%d",&ita);
int maxi=1<<28;
for(int j=ita;j>=0;j--)
if(dp[1-cur][j])
{
maxi=min(dp[1-cur][j]+abs(ita-j),maxi);
break;
}
for(int j=ita+1;j<maxn;j++)
if(dp[1-cur][j])
{
maxi=min(dp[1-cur][j]+abs(ita-j),maxi);
break;
}
dp[cur][ita]=maxi;
}
}
int ans=1<<28;
for(int i=0;i<maxn;i++)
if(dp[cur][i])
ans=min(dp[cur][i]-1,ans);
printf("%d\n",ans);
}
return 0;
}