博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LETTers第五场-搬寝室-解题报告
阅读量:5012 次
发布时间:2019-06-12

本文共 1121 字,大约阅读时间需要 3 分钟。

题目描述:

    给出n个数,从中找出k对数使得每对数差的平方之和最小。

题面建模:

    dp。

    设定dp[i][j]存储的值为当选择到第i个数时,已选出j对数的最小差的平方。

    那么有转移方程dp[i][j]=Min(dp[i-1][j],dp[i-2][j-1]+(object[i]-object[i-1])*(object[i]-object[i-1]))

    这样最后的答案为dp[n][k]。

解题要点:

    注意边界的处理和dp数组的初始化,开始的时候应将dp[i][j]=INF。

时空开销分析:

    空间复杂度:O(n)。

    时间复杂度:O(n^2)。

特别说明:

   无。

程序:

 

#include 
#include
#include
#define INF (1<<30)int object[2010];int dp[3][1010];int cmp(const void *a,const void *b){ return *((int*)a)-*((int*)b);}int Min(int a,int b){ return a>b?b:a;}int main(){ int n,k,i,j; while(scanf("%d %d",&n,&k)!=EOF) { for(i=1;i<=n;i++) scanf("%d",object+i); qsort(object+1,n,sizeof(object[0]),cmp); memset(dp,0,sizeof(dp)); for(i=0;i<3;i++) for(j=1;j<=k;j++) dp[i][j]=INF; for(i=1;i<=n;i++) for(j=1;j<=(i>>1)&&j<=k;j++) dp[i%3][j]=Min(dp[(i-1)%3][j],dp[(i-2)%3][j-1]+(object[i]-object[i-1])*(object[i]-object[i-1])); printf("%d\n",dp[n%3][k]); } return 1;}

 

转载于:https://www.cnblogs.com/LETTers/archive/2012/04/21/2461055.html

你可能感兴趣的文章
归并排序法
查看>>
【剑指offer】面试题26:复杂链表的复制
查看>>
spark开发生成EXE
查看>>
Vue 全家桶介绍
查看>>
WPF Bitmap转Imagesource
查看>>
Java compiler level does not match the version of the installed Java project facet.解决方法
查看>>
笔记_小结
查看>>
Linux lsof命令 umount U盘
查看>>
自定义Font
查看>>
linux svn 服务端搭建
查看>>
linux时间同步ntp服务的安装与配置
查看>>
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法...
查看>>
网络编程-socket并发-粘包问题
查看>>
python 中安装pandas
查看>>
Hibernate 的<generator class="native"></generator>的不同属性含义
查看>>
linux修改root账户的用户名所得的教训
查看>>
【LeetCode】Flatten Binary Tree to Linked List
查看>>
读后感-浮生六纪
查看>>
执行指定路径的程序文件
查看>>
Leetcode-950 Reveal Cards In Increasing Order(按递增顺序显示卡牌)
查看>>