caioj 1077 dp

来源:互联网 发布:中国十大网络作家 编辑:程序博客网 时间:2024/06/09 21:37

题目描述

【问题描述】

共N根筷子,长度为T1,T2,T3,……,TN。组成K+3对,使每双的筷子长度差的平方和最小。

【输入文件】

输入文件共有两行,第一行为两个用空格隔开的整数,表示N,K(1≤N≤100,0<K<50),第二行共有N个用空格隔开的整数,为Ti每个整数为1~50之间的数。

 

【输出文件】

输出文件仅一行。如果凑不齐K+3双,输出-1,否则输出长度差平方和的最小值。



i表示筷子的双数。j表示筷子下标。

转移方程:f[i][j]=min(f[i][j],min(f[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j]),f[i][j-1]));

从i-1双时再选一双或直接不选筷子跳过来。

注意初始化为

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int n,k,f[110][110],a[101];int main(){scanf("%d%d",&n,&k);for (int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);memset(f,0x3f,sizeof(f));f[0][0]=0;if (((k+3)*2)>n) {printf("-1");return 0;}else{for (int i=1;i<=k+3;i++)for (int j=2;j<=n;j++) {f[i][j]=min(f[i][j],min(f[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j]),f[i][j-1]));}printf("%d",f[k+3][n]);return 0; }} 

maxlongint后要将f[0][0]赋为0,否则你的值只会超级大!

原创粉丝点击