题目

时限20s,T(T<=100)组样例,共E(E<=100)次锻炼,每次锻炼可能需要W(W<=100)种杠铃,

第i天第j种所需要的杠铃片数为Xij(0<=Xij<=100),

杠铃片放到一个形如「栈」的杠铃架上,

比如,第一天是AABA,第二天是AACCDD,

则需要第一天放入AABA,弹掉A,弹掉B,

再放入C,放入C,放入D,放入D,才能得到第二天的杠铃片

最后求杠铃架从空的初始状态,锻炼完E次后,再保持空状态,

所操作的杠铃片的最小数量是多少

思路来源

官方题解

jiangly代码

题解

注意到,如果第[1,n]次锻炼内有一些杠铃片是公共的,

则这些杠铃片可以直接垫在底下,最开始放入,最后取出,然后忽略这些杠铃片

然后考虑分治,第[l,r]次锻炼的答案可以由[l,x]和[x+1,n]求得,

设第[l,r]次锻炼公共的杠铃片为mn[l][r],

则第[l,r]次锻炼,可以拆解成,

一开始在栈内垫入mn[l][x]个杠铃片,进行第[l,x]次锻炼,完成后弹栈把杠铃片删成mn[l][r]个,

再垫杠铃片使栈内杠铃片数为mn[x+1][r]个,进行第[x+1,r]次锻炼,完成后把杠铃片删完

一开始初始化长度为1的区间,其贡献为2*mn[i][i],表示杠铃片的变化为0->mn[i][i]->0

则区间合并的时候,合并前杠铃片的变化是0->mn[l][x]->0->mn[x+1][r]->0,

合并后,杠铃片的变化为0->mn[l][x]->mn[l][r]->mn[x+1][r]->0,即发生合并时,答案减去2*mn[l][r]

心得

想到这个公共杠铃片的trick了,但还是最终没能想到区间dp

看了看自己做过的题,发现和hdu4283 You Are the One(区间DP)这个题很像

题解是按jiangly代码写的,官方题解与之大同小异。

官方题解

dp[l][r]表示把第[l,r]次锻炼公有的杠铃片(其个数记为C[l,r])事先加载进栈,锻炼完第[l,r]次后,弹栈使得栈内最终只保留这C[l,r]个杠铃片的最小操作次数。

转移考虑枚举一个中间次数x,dp[l][r]=min(dp[l][r],dp[l][x]+dp[x+1][r]+2*((C[l,x]-C[l,r])+(C[x+1,r]-C[l,r]))),表示一个拆解为子问题的过程。

要锻炼[l,r]这些次,栈中现在有公有杠铃片C[l,r]个,先入栈使栈内杠铃片变成C(l,x)个,再进行第[l,x]次锻炼,再弹栈让杠铃片恢复为C[l,r]个,再入栈使杠铃片变为C[x+1,r]个,再进行第[x+1,r]次锻炼,再弹栈让杠铃片恢复为C[l,r]个。

最后答案为dp[1][n]+2*C[1][n]。

或者引入空元素0、n+1,最后答案为dp[0][n+1]。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=105,INF=0x3f3f3f3f;
int t,n,m,dp[N][N],a[N][N],mn[N][N],now[N];
int main(){scanf("%d",&t);for(int ca=1;ca<=t;++ca){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf("%d",&a[i][j]);}}memset(mn,0,sizeof mn);for(int l=1;l<=n;++l){memset(now,INF,sizeof now);for(int r=l;r<=n;++r){for(int j=1;j<=m;++j){now[j]=min(now[j],a[r][j]);mn[l][r]+=now[j];}}}for(int i=1;i<=n;++i){dp[i][i]=2*mn[i][i];}for(int len=2;len<=n;++len){for(int l=1;l+len-1<=n;++l){int r=l+len-1;dp[l][r]=INF;for(int k=l;k+1<=r;++k){dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]-2*mn[l][r]);}}}printf("Case #%d: %d\n",ca,dp[1][n]);}return 0;
}

Round 1A 2022 - Code Jam 2022 C.Weightlifting(区间dp)相关推荐

  1. Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp

    传送门 文章目录 题意: 思路: 题意: 给定一个序列aaa,每次拿出来任意一个数(注意每次选的数不同),让后定义max=max(a1,a2,...,ai)max=max(a_1,a_2,...,a_ ...

  2. Code Jam - Store Credit for Python

    这道题是Code Jam Africa 2010, Qualification Round的原题,现被用于练习 (https://code.google.com/codejam/contest/351 ...

  3. Hacked Exam-Google Codejam 2021 Round 1A

    Hacked Exam-Google Codejam 2021 Round 1A第三题 There is an exam with Q(1 ≤\leq≤ Q ≤\leq≤ 120)true or fa ...

  4. Code jam 2008 practice A

    Code jam 2008 practice A A:Saving the universe B:Train timetable C:Fly swatter A: The urban legend g ...

  5. Google Code Jam程序设计大赛中国人获冠亚军

    来自 Google的官方消息,今年的Google Code Jam程序设计大赛,冠亚军都被中国人获得. 冠军是楼天城(Tiancheng Lou,来自清华大学计算机系),奖金$10,000.亚军朱泽园 ...

  6. 入职顶级互联网公司,竞争性编程是必须的吗?Google code jam King赛前采访(附有视频)

    主持人:你能告诉我一些关于你自己的事吗 受访者:就像我决定从事的竞争性编程一样,竞争性编程我不仅参加了那些比赛,高中时我在美国参加Google Code Jam,因为我进入了决赛,这是我生命中的一部分 ...

  7. Code Jam to I/O for Women 2016【上】

    这次code jam一共四大题. 下面分别详细展示A+B两道题的解题思路及Python代码. Problem A. Cody's Jams 题目: Problem Cody, the owner of ...

  8. 只能在公司代码XXX的期间 2022/03 和2022/02 中记账,MMPV打开物料账记账期间

    在收货的时候报错:只能在公司代码XXX的期间 2022/03 和2022/02 中记账 说明:当前的时间与目前已开的记账期间不符. MMRV查看当前记账期间 以下截图只是示例,没有当时的截图 用MMP ...

  9. 2022.4.30—2022.6.22 学习报告

    目录 2022.4.30 2022.5.2 数据流图(Dataflow Graph) Sesssion 构建计算图 2022.5.3 Deep Label Distribution Learning ...

最新文章

  1. Java 集合 — HashMap
  2. [转]MD5(1)-安全性与原理
  3. 设置按峰值带宽计费_如何理解串联谐振电路中的带宽?
  4. python代码模块与模块之间空1行_Day006|Python语法基础
  5. FluentAspects -- 基于 Fluent API 的 Aop
  6. 【布莱克智讯之声公众号】 精彩图文分类导航
  7. 基于iOS 10、realm封装的下载器
  8. Microsoft Blazor Platz.SqlForms开源——使用架构生成器设计和维护SQL Server数据库
  9. 使用 pycharm安装各个模块
  10. 一个堆排我竟弄了 4 个动画
  11. [转]C语言如何获得精确到毫秒的时间
  12. 汽车销售管理系统 c语言版 课程设计,《汽车销售管理系统 C语言版》.doc
  13. matlab 峰值提取,Matlab2019b信号峰值检测与提取
  14. css中鼠标悬停背景色从左到右
  15. npm 清理缓存命令 【最新的】
  16. apple id密码错误_如何更改您的Apple ID密码
  17. 我的2018:微信朋友圈的24个瞬间
  18. 取模(余)%运算详解
  19. matlab第一次学习成果
  20. Blender:如何翻转UV

热门文章

  1. android mtk camera startpreview,android8.1 mtk camera hal各种操作流程
  2. 第一行代码读书笔记(Chapter2 探究新语言,快速入门Kotlin编程)
  3. 毅力号火星漫游机器人成功着陆开启远古生命起源探索
  4. 英国主要跨境电商平台简单介绍
  5. 序列密码知识整理(一 简介)
  6. 小米10s开启录屏方法详细介绍
  7. html c3效果,使用c3动画实现摇铃铛效果
  8. 嵌入式开发笔记——CPLD与MCU模拟SPI通信
  9. python使用urllib发送post请求_python使用urllib2提交http post请求的方法
  10. 单片机实现温度传感器