ACM第6天 Dp进阶HDU 1421 搬寝室

简介: 搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18724    Accepted Submission(s): 6338 Problem Description 搬寝室是很累的,xhd深有体会.

搬寝室

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18724    Accepted Submission(s): 6338



Problem Description
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
 

Input
每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).
 

Output
对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.
 

Sample Input
  
  
2 1 1 3
 

Sample Output
  
  
4
 

Author
xhd
 

Source
 

Recommend
lcy
 

怎么说呢,这道题我提交的时候wa了很多次,然后自己仔细回想,的确是自己的思路没有理顺畅,这作为一道比较经典的DP的题目是有必要拿来反思的
首先,我们应该对输入数据进行一次排序,按顺序排好后很容易可以知道相邻两个的物品重量差一定是对于这两个物品来说是最小的,然后就是动态规划的转移方程了
动态转移方程看起来好像大多都差不多,而轻微的差别就相差很多
对于这个问题,首先
我们取一个二维数组DP[ i ] [ j ] 其中,i 表示取前 i 个物品,j 表示前 i 个物品里面取 j 对物品。然后在DP[ i ] [ j ] 里面保存它的值,如果形象地把它描述出来就是一张表格

就是在绿框这个位置开始,我们开始我们的循环,即再怎么绝,你也得从前两件物品里选出一对吧,注意是选出一对,DP[ i ] [ j ]就是前 i 件物品里选出 j 对;
如果一个物品都不拿就是0的疲劳值,而我们在前 i 件物品里面选 j 对物品和我们从前 i - 1 件物品里选出 j 对的情况是一样都只能选出 j 对,
所以这道题的 状态转移方程可以写成 DP[ i ][ j ] = min(DP[ i-1 ][ j ],DP[ i - 2][ j - 1] + (mass[ i ] - w [ i - 1 ])^2)                   PS:(为了让min函数起效果要先把数组其他位置初始化为一个很大的值)
然后通过两个for循环每次都往前走一步这样就可以保证在物品 a1,a2,a3这种组合里我们肯定能取到小的差的那一对物品。
然后我们输出就只要输出那个前 n 件物品里取 k 件的情况就可以了 就是 DP[ n ][ k ];
然后在下面附上代码。

#include <iostream>
#include <algorithm>
#define MAXN 2010
#define INF 2147483646  
using namespace std;
int mass[MAXN];
int dp[MAXN][MAXN];
int main()
{
    int n, k;
    while (cin>>n>>k){
        mass[0] = 0;
        for (int i=1; i<=n; ++i)
            cin>>mass[i];
        sort(mass, mass+n+1);
        dp[0][0] = 0;
        for (int i=0; i<=n; ++i){
            for (int j=1; j<=k; ++j)
                dp[i][j] = INF;
        }
        for (int i=2; i<=n; ++i){
            for (int j=0; 2*j<=i; ++j){
                dp[i][j] = min(dp[i-1][j], dp[i-2][j-1]+(mass[i]-mass[i-1])*(mass[i]-mass[i-1]));
            }
        }
        cout<<dp[n][k]<<endl;
    }
    return 0;
}


相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
阿里云百炼平台可使用的大模型有哪些?191款大模型能力及收费标准参考
本文详细介绍了阿里云百炼平台所支持的大模型生态,主要涵盖了平台核心能力、千问(Qwen)大模型的技术优势、以及平台上可供调用的191款大模型的具体能力描述与收费标准。文章从千问大模型的基础介绍出发,逐步展开至各款模型的技术参数、应用场景及定价信息,为开发者和企业用户提供了一份全面的模型选型参考指南。
|
2月前
|
SQL 人工智能 自然语言处理
上线第一周就拦下1条危险SQL:Agent连库四道防线
从团队试点AI Agent做数据问答差点出事的真实经历出发,梳理Agent连数据库与传统用户连库的本质区别,拆解提示注入、误操作、查询风暴、敏感泄露四类风险,给出最小权限只读账号、高危SQL拦截、全链路审计、速率控制四道防线的实操方案与避坑清单。
|
8月前
|
人工智能 调度 异构计算
基于自学习小AI的大模型算力集群智能优化方案
本方案基于原创轻量自学习小AI架构,专为大模型研发设计:通过GPU池化+小AI智能调度,无需新增高端GPU,即可将集群算力利用率从30%提升至80%以上,年省千万级成本。小AI自主学习、抗遗忘、守规则,零硬件投入、高技术壁垒、强场景适配。(239字)
|
2月前
|
人工智能 编解码 安全
我把电脑外包给豆包后,效率飞升!【附教程】
看完这篇,你将比99%的人更会用豆包~
724 0
|
4月前
|
人工智能 自然语言处理 定位技术
Ian Xiaohei Illustrations:让 AI 为你画出文章的“认知锚点”
Ian Xiaohei Illustrations 是一个 Skill,用来指导 AI Agent 为中文文章、帖子、博客、Notion 文档和方法论内容生成正文配图。
511 2
Ian Xiaohei Illustrations:让 AI 为你画出文章的“认知锚点”
|
6月前
|
IDE 开发工具 iOS开发
JetBrains IDE 2026.1 (macOS, Linux, Windows) - 跨平台开发者工具
JetBrains IDE 2026.1 (macOS, Linux, Windows) - 跨平台开发者工具
422 7
JetBrains IDE 2026.1 (macOS, Linux, Windows) - 跨平台开发者工具
|
6月前
|
机器学习/深度学习 传感器 算法
用 200 元改了一个普通摄像头,测直径稳定到 ±5 微米
本项目实现了一种低成本、高鲁棒的圆形工件视觉检测方案:仅用200元USB摄像头,无需远心镜头与深度学习,15ms内完成检测,直径重复精度达±2μm,圆心定位误差<0.01mm;自动抑制灰尘、划痕、油污干扰,换型一键标定,结果可解释。
547 3
|
6月前
|
人工智能 算法 数据处理
AI医疗的破冰时刻——从辅助诊断到新药研发
2025年,AI医疗迎来了真正的“破冰时刻”。与以往炒作不同,这一次,AI开始在实际临床场景中创造可量化、可复现、可规模化的价值。
522 0
|
6月前
|
Web App开发 安全 测试技术
只需3步,无影云电脑一键部署实在Agent(企业级智能体极速落地指南)
本文详解如何在阿里云无影云电脑上快速部署实在Agent:涵盖环境配置(地域选择、规格推荐、系统镜像)、三步极速安装(5分钟完成)、阿里云服务集成(百炼大模型、权限配置)、性能验证及企业级优化方案,助力企业零硬件投入、安全合规地实现智能自动化。(239字)
762 0
|
存储 小程序 Python
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
### 农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 该程序通过`lunardate`库实现公历与农历的日期转换,支持闰月和跨年处理,用户输入农历节日名称后,可准确计算距离该节日还有多少天。功能包括农历节日查询、倒计时计算等。欢迎使用! (239字符)
1515 86

热门文章

最新文章