HDU-3392 Pie DP

来源:互联网 发布:靠谱欧洲代购淘宝店 编辑:程序博客网 时间:2024/06/10 12:33
题目链接
题目意思是让输入N个男的身高M个女的身高
让min(N,M)那一方全部配对完,求最小的差值总和
注意题目条件 |n – m| <= 100

所以每个只要从i+1找到i+n-m就可以了


#include "stdio.h"#include "string.h"#include "algorithm"using namespace std;int n,m;double b[10005],g[10005];double dp[2][120];        //一维滚动数组 |n-m|小于等于100 所以二维超过100即可double fabs( double x ){return x>=0?x:-x;}double min( double a,double b ){return a<=b?a:b;}void DP( int n,int m,double *a,double *b ){sort( a+1,a+n+1 );                     //排序sort( b+1,b+m+1 );memset(dp,0,sizeof(dp));int len = m-n+1;                  //长度差for( int i=1; i<=n; i++ )         //男生{dp[i%2][1] = dp[(i-1)%2][1] + fabs( a[i] - b[i]);   //默认先选第i个元素for( int j=2; j<=len; j++ )//匹配女生  匹配长度差超过len 后面的将不够匹配{dp[i%2][j] = min( dp[(i-1)%2][j]+fabs( a[i] - b[i+j-1]) , dp[i%2][j-1] );   }}printf("%.6lf\n",dp[n%2][len]);}int main(){int i;while( scanf("%d%d",&n,&m)==2,(n||m) ){for( i=1; i<=n; i++ )scanf("%lf",&b[i]);for( i=1; i<=m; i++ )scanf("%lf",&g[i]);if( n<=m )                 //用短的匹配长的DP( n,m,b,g );elseDP( m,n,g,b );}return 0;}