您的位置:首页 > 其它

UVA10271

2015-10-18 21:50 393 查看
/*
题意: 有t组测试数据,给出n,m. m个数升序,要从m个数中选出n+8对三元组。
要求这三个数x<=y<=z, 其中每对的代价为(x-y)^2。
问最小的代价是多少。
分析:
定义 dp[i][j] 为从 i 根筷子里选出 j 对。
除了最长的那根筷子,其余两根一定相邻,因为只有这样代价才最小 ,
那么只要降序排列,且 i>=j*3 就可以有更长的筷子与选出来的两根配对。
对于第 i 根筷子,
如果不参与第 j 对 ,那么问题转化成从 i-1 根里选 j 对;
如果参与,那么就是从 i-2 根里选 j-1 对。即有:
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])^2);

*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX 999999999
using namespace std;
int dp[5010][1010],a[5010];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
n+=8;
for(int i=m;i>0;i--)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
dp[i][0]=0;
for(int j=1;j<=n;j++)
dp[i][j]=MAX;
}
for(int i=3;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(i>=j*3 && dp[i-2][j-1]!=MAX)
dp[i][j]=min(dp[i-1][j], dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]) );
}
}
printf("%d\n",dp[m]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: