【19周-星耀】FASTER!FASTER!FASTER!
题目:
解题报告:
看数据范围,应该是个n^3的dp。
但是刚开始觉得二维就可以写。
但是G了,因为无法根据定义的状态判断从[i]到[i+1]的速度是多少。我这直接默认是d[i]了,但是显然不一定是。
然后感觉欸,我是不是可以,还是【dp[i][j]代表跑到第i个,并且拆了j个牌子的最短时间】,这样定义状态,但是转移的时候再加一个遍历,从前面找到用时最少的转移过来,但是还是不对啊,局部最优解不代表全局最优解啊,这个速度不一定是全局最优解的速度啊
for(int i = 1; i<=n; i++) {dp[i][0] = dp[i-1][0] + (d[i]-d[i-1])*a[i];for(int j = 1; j<=k; j++) {dp[i][j] = dp[i-1][j] + (d[i]-d[i-1])*a[i];// 不拆for(int s = 1; s<=i-1; s++) {// 拆第s个dp[i][j] = min(dp[i][j], dp[s][j] + (d[i]-d[s])*a[s]);}}}
其实我这个转移方程也不对,如果你想表示决策是:【把[s+1, i-1]都拆掉】,那还可以考虑这样的转移框架(dp[i]从dp[s]转移过来)。但是如果决策是【只考虑拆一个牌子】那肯定是用dp[i]从dp[i-1]转移的框架。
所以老老实实三维dp,dp[i][j][s]代表跑到第i个位置,拆了j个,并且到位置i时的速度是a[s],的最小时间花费。时间复杂度O(n^3),空间复杂度O(n^3)
然后代码如下:
#include<bits/stdc++.h> using namespace std;
#define ll long long
ll dp[2][505][505];// dp[i][j][s]代表跑到i个立牌,并且拆了j个立牌,最后速度是a[s]的最少用时ll d[505], a[505];
ll n,l,k;
const ll INF = 1e16;
int main( )
{cin>>n>>l>>k;for(int i = 1; i<=n; i++) cin>>d[i];d[n+1] = l;for(int i = 1; i<=n; i++) cin>>a[i];memset(dp, 0x3f, sizeof(dp));//第2个柱子dp[0][0][1] = (d[2]-d[1])*a[1];// dp[i][j][s] 跑到第i个,拆了j个,以s的速度跑的。//如何确定自己dp设定状态是带有冗余状态的。for(int i = 3; i<=n+1; i++) {memset(dp[idx], 0x3f, sizeof(dp[idx]));for(int j = 0; j<=k; j++) {// 不删第i-1个 ,只有这种情况第三维才是i-1,其他情况第三维都<i-1ll mx = INF;for(int s = 0; s<=i-2; s++) mx = min(mx, dp[i-1][j][s]);dp[i][j][i-1] = mx + (d[i]-d[i-1])*a[i-1];// 以第i-1的速度if(j == 0) continue;//必删第i-1个for(int s = 0; s<i-1; s++) {// 以第s个的速度过来dp[i][j][s] = dp[i-1][j-1][s] + (d[i]-d[i-1])*a[s];// 以第[0,i-2]速度// dp[i][j][s] = dp[s][j-1][s] + (d[i]-d[s])*a[s]; 注意这里不能是s,第一维都必须是i-1}}}ll ans = INF;for(int i = 0; i<=n; i++) {ans = min(ans, dp[(n+1)%2][k][i]);}cout << ans << endl;return 0;
}
然后发现数组开不了这么大,滚动优化一下:时间复杂度O(n^3),空间复杂度O(n^2)
AC代码:
#include<bits/stdc++.h> using namespace std;
#define ll long long
ll dp[2][505][505];// dp[i][j]代表从i开始跑,并且拆了j个立牌的最少用时ll d[505], a[505];
ll n,l,k;
const ll INF = 1e16;
int main( )
{cin>>n>>l>>k;for(int i = 1; i<=n; i++) cin>>d[i];d[n+1] = l;for(int i = 1; i<=n; i++) cin>>a[i];memset(dp, 0x3f, sizeof(dp));//第2个柱子dp[0][0][1] = (d[2]-d[1])*a[1];// printf("dp[%d][%d][%d]=%lld\n", 2,0,1, dp[0][0][1]);// dp[i][j][s] 跑到第i个,拆了j个,以s的速度跑的。//如何确定自己dp设定状态是带有冗余状态的。for(int i = 3; i<=n+1; i++) {int idx = i%2;int idx2 = 1-idx;memset(dp[idx], 0x3f, sizeof(dp[idx]));for(int j = 0; j<=k; j++) {// 不删第i-1个 ,只有这种情况第三维才是i-1,其他情况第三维都<i-1ll mx = INF;for(int s = 0; s<=i-2; s++) mx = min(mx, dp[idx2][j][s]);dp[idx][j][i-1] = mx + (d[i]-d[i-1])*a[i-1];// 以第i-1的速度// printf("dp[%d][%d][%d]=%lld\n", i,j,i-1, dp[idx][j][i-1]);if(j == 0) continue;//必删第i-1个for(int s = 0; s<i-1; s++) {// 以第s个的速度过来dp[idx][j][s] = dp[idx2][j-1][s] + (d[i]-d[i-1])*a[s];// 以第[0,i-2]速度// printf("dp[%d][%d][%d]=%lld\n", i,j,s, dp[idx][j][s]);}}}ll ans = INF;for(int i = 0; i<=n; i++) {ans = min(ans, dp[(n+1)%2][k][i]);}cout << ans << endl;return 0;
}
总结:
注意这题的几个细节点:
1、因为最后一个立牌不是终点,所以需要把终点当做第n+1个立牌。这样dp直接到n+1
2、注意这题初始化需要初始化dp[1]和dp[2],然后从3开始递推。
【19周-星耀】FASTER!FASTER!FASTER!相关推荐
- 互联网晚报 | 8月24日 星期二 | 京东二季度收入2538亿元;小米7亿元成立公寓管理公司;荣耀上线新零售平台“星耀商城”...
今日看点 ✦ 小米回应"7亿元成立公寓管理公司":是员工公寓,增强员工幸福感 ✦ 京东集团二季度营收2538亿元.经营利润3亿元,活跃购买用户数达5.32亿 ✦ 荣耀旗下新零售电商 ...
- 热血传奇之周星弛[转载]【出处:未知】
盛大传奇史诗巨作,根据红花<半夜猪叫>改编 周星驰最近大片<石墓凌凌漆> 剧情简介--关于游戏在人生中所占的位置,不同的人可能具有不同看法,有人视人生如游戏,对什么都无所谓(见 ...
- 超市收银程序_超市收银系统案例|千平超市再开2家,星耀助力门店年关创收...
思迅天店星耀版收银系统案例_超市收银系统:千平超市再开2家,星耀助力门店年关创收 年关冲刺,收银压力,库存管理...... 都是现在超市老板们的工作重点 近期开业 横溪购物中心和汇隆购物广场 妥妥的千 ...
- 红魔游戏手机6S Pro星耀白版开启预约:4399元起10月15日正式首销
9月6日,新一代游戏手机红魔6S Pro发布,该机配备165Hz超竞屏,搭载骁龙888 Plus旗舰处理器,提供有耀影黑.星耀白.氘锋透明版三款配色可供选择,受到了不少电竞爱好者的关注,不过此前仅有耀 ...
- 超市收银程序_思迅天店星耀版收银系统助力超市商品建档!
生活超市商品种类多.建档麻烦是每一个生活超市都会遇到的问题,曾经为了解决这一问题,只得让工作人员抄录,耗时又耗力,工作效率还低.如今,有了超市收银系统,只需上线一款思迅天店星耀版收银系统,商品种类多. ...
- 星加坡php开发_新加坡樟宜机场新地标-星耀樟宜 | 贝诺Benoy
机场永远是个繁忙的地方,甚至可以说,繁忙程度前所未有.近年来,航空客运需求的年增长率大幅上升,从2008年的2.4%增至2017年的7.5%,[1]全球乘客总人数预计将从2016年的77亿人次上升至2 ...
- 北京智和信通受邀出席2022IT运维大会,荣获“2022智能运维星耀榜最具影响力企业”
9月8日,由IT运维网.<网络安全和信息化>杂志社联合主办的"2022(第十三届)IT运维大会"在北京辽宁大厦成功举办.大会以"智慧先行,运维有术" ...
- python目前版本强势英雄_王者荣耀:分析S10星耀局以上一些强势英雄及版本目前排位的形势...
大家好,我是小西 . 首先,从前些日子开始,基本可以说从星耀1往上走,就不要adc了,哪边选ADC,哪边就容易输(这个没有反对的吧大家) 大家别看那些强势战士都已经削了一轮,在高端局,ADC一直以来都 ...
- 华为nova7星耀版和华为nova7普通版 的区别 哪个好
华为nova7星耀版与普通版最大的区别就是星耀版拥有定制的蜜语红配色,并且机身logo也不是传统的华为logo. 华为手机爆降600这活动太给力了 机会不容错过 https://www.huawei. ...
最新文章
- 基于改进SURF算法的实时视频拼接
- NLP深度学习:基于TensorFlow实现Skip-Gram模型
- Redis 热 Key 发现以及解决办法
- 使用Spring-hadoop小结
- 文件上传~Uploadify上传控件~续(多文件上传)
- Linux学习总结(50)——grep查看打印匹配的下几行或前后几行使用总结
- django解决页面跳转问题
- 【编程】常见概念的理解 —— inplace、vanity url、vanilla(code/software)、编译、链接、build、(delegate、proxy)
- 哈工大SCIR Lab | EMNLP 2019 结合单词级别意图识别的stack-propagation框架进行口语理解...
- centos nginx和tomcat集群
- Hadoop报错 Failed to locate the winutils binary in the hadoop
- amd核芯显卡控制面板自定义分辨率_电脑显示器分辨率超频教程:1080P超2K分辨率的方法...
- 美图秀秀java代码,【Java】SpringMvc整合美图秀秀M4(头像编辑器)
- Latex中文简历制作
- matlab二维插值绘制地貌图
- 上周刚号召加班,这周立马双休,董明珠把互联网玩明白了……
- 梅特勒托利多xk3124电子秤说明书_托利多电子秤设置说明
- sht30 linux示例代码,SHT30 Linux标准 i2c-dev 读取程序
- 最小二乘法拟合椭圆——MATLAB和Qt-C++实现
- 网络基础之为了安全而诞生的NAT(网络地址转换)