/*
* Sicily1828Minimal.cpp
*
* Created on: 2015年1月13日
* Author: Prophet
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAX_M = 500+5;
int main(){
int TestCase;
scanf("%d",&TestCase);
while(TestCase--){
int N,M;
int S1[MAX_M],S2[MAX_M];
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
scanf("%d",&S1[i]);
for(int i=1;i<=M;i++)
scanf("%d",&S2[i]);
int dp[MAX_M][MAX_M];//dp[i][j]表示排序后S1的前i个和S2的前j个的F(S1,S2)
/*加入一个新的S1(i)后,其可能与S2中的j或j-1有最小差,因此动规方程为:
* dp[i][j] = min(dp[i][j-1],dp[i-1][j-1]+abs(i,j))
* 需要注意的地方是S1的数量要少于S2,且S2的数据不能重用,因此初始化的时候要注意
* */
sort(S1+1,S1+N+1);
sort(S2+1,S2+M+1);
for(int i=1;i<=N;i++){
if(i==1) dp[1][i] = abs(S1[1]-S2[1]);
else dp[i][i] = dp[i-1][i-1]+abs(S1[i]-S2[i]);
}
/*for(int j=2;j<=M;j++){
for(int i=2;i<=j;i++){
dp[i][j] = min(dp[i][j-1],dp[i-1][j-1]+abs(S1[i]-S2[j]));
}
}*/
for(int i=1;i<=N;i++){
for(int j=i+1;j<=M;j++){
dp[i][j] = min(dp[i][j-1],dp[i-1][j-1]+abs(S1[i]-S2[j]));
}
}
cout<<dp[N][M]<<endl;
}
}
Sicily1828Minimal
最新推荐文章于 2017-04-09 10:32:00 发布