【動態規劃】飆車
来源:互联网 发布:英烈千秋 知乎 编辑:程序博客网 时间:2024/06/10 03:49
题目描述[说明]此题中出现的所有数字均为整数[背景]有天SubRaY发现宇宙新秀在玩一个游戏叫Need For Speed(什么?连大名鼎鼎的极品飞车都没听说过..),他发现宇宙新秀总是逆行,于是出现以下对话:SubRaY:你怎么老是在逆行道跑..宇宙新秀:近!SubRaY:你就不怕撞车..宇宙新秀:你提前写个程序计算一下不就完了!SubRaY:……SubRaY实在不会写这个程序,于是他交给你..[题目描述]已知公路总长L米,一共有K个赛道,你的赛车总是和公路上其他的普通的车走相反的方向,并且所有的车每秒沿赛道行驶1m(具体看图)(宇宙新秀:我的Evo IV怎么这么烂….).问题是:跑到终点最少撞多少次车?我们简化一下模型,画一个(L+1)*K的网格,设所有的车都是点,并且每秒末都会出现在这个网格的某个顶点上.公路上其他的车都以固定的1m/s的速度自上而下行驶,而你的跑车自下而上行驶,并且每秒可以从一个点行驶到它上方\左上方\右上方的点(假设飘移不浪费时间,具体请看图).我们假设,撞车不会使车损坏,不会使车减速(宇宙新秀:我的Evo IV怎么这么强~~)对于撞车的设定:当每秒末你的车和另外一辆车处在同一点上时,算撞车;你的车和另一辆车迎面开过来,算撞车.具体请看下图:假设一开始你可以选择任意一个赛道开始比赛,要求你写一个程序,计算到达终点至少要撞多少次车.对于上边的例子,只要开始选择第三赛道开始跑,然后一路向北,就可以不撞车而到达终点.[对样例2的说明]初始 第一秒 第二秒 第三秒距终点0m 1111距终点1m 1111 1111距终点2m 1111 1111 1111距终点3m 0000 1111 1111 1P11距终点4m 1111 0000 P111 1111距终点5m 0000 P111 0000 1111距终点6m CC代表该点只有你的车,P代表该点既有你的车又有其他的车.最优方案为第一秒直走,与一辆车相撞,第二秒直走,又与一辆车相撞,第三秒斜向右走,又与一辆车相撞,总共三次.如果第三秒直走,将与两辆车相撞,那么就撞了四次,所以三次最优.[对样例3的说明]不停地斜着走[数据范围]1<=n<=100,1<=k<=10输入格式首行两个数,L,K,表示赛道距离,以及有几个赛道.接下来L行,每行K个字符,第i行第j个字符表示公路距终点距离为i-1的第j个赛道的初始状态:0表示该点没有车,1表示该点有车.铭记一点:初始时你的车在第L+1行,你可以指定一个第L+1行的位置为你的车的初始位置,而第L+1行是不在输入文件里的.输出格式一个数ans,表示最少撞车次数样例输入[样例输入1] 4 4 1000 0100 0001 0000 [样例输入2] 6 4 1111 1111 1111 0000 1111 0000 [样例输入3] 4 4 1111 1111 1111 1111样例输出[样例输出1] 0 [样例输出2] 3 [样例输出3] 2
這是一道容易的動態規劃。
存儲方式:縱向倒置賽道。
狀態:用f[i][j]表示走到第i行,第j個賽道的最少撞車次數。
轉移方程:f[i][j] = min(f[i - 1][j] + cost1, f[i - 1][j - 1] + cost2, f[i - 1][j + 1] + cost3)。
其中,cost1是在第i個時刻走到點(i, j)和點(i - 1, j)的車輛數之和,即在點(2i, j)與在點(2i - 1, j)的車輛數之和(因為直走撞車有兩種情況);cost2,cost3是在第i個時刻走到點(i, j)的車輛數(斜著走撞車只有一種情況)。
ACCode:
#include <iostream>#include <cstring>#include <cstdlib>#include <bitset>using std::bitset;using std::cin;using std::min;using std::string;const char fi[] = "rqnoj94.in";const char fo[] = "rqnoj94.out";const int maxN = 110;const int maxK = 20;const int MAX = 0x3fffff00;const int MIN = -0x3fffff00;int f[maxN][maxK];bitset <maxK> map[maxN << 1];int n, m;string s; void init_file() { freopen(fi, "r", stdin); freopen(fo, "w", stdout); std::ios::sync_with_stdio(false); } void readdata() { cin >> n >> m; for (int i = n; i > 0; --i) { cin >> s; bitset <maxK> tmp(s); map[i] = tmp; } } void work() { memset(f, 0x3f, sizeof(f)); for (int j = 0; j < m; ++j) f[0][j] = 0; for (int i = 1; i <= ((n + 1) >> 1); ++i) for (int j = 0; j < m; ++j) { f[i][j] = min(f[i][j], f[i - 1][j] + map[i << 1].test(j) + map[(i << 1) - 1].test(j)); if (j > 0) f[i][j] = min(f[i][j], f[i - 1][j - 1] + map[i << 1].test(j)); // if (j < m - 1) f[i][j] = min(f[i][j], f[i - 1][j + 1] + map[i << 1].test(j)); // } int ans = MAX; for (int j = 0; j < m; ++j) ans = min(ans, f[(n + 1) >> 1][j]); printf("%d", ans); } int main(){ init_file(); readdata(); work(); exit(0);}
- 【動態規劃】飆車
- 【動態規劃】配製魔藥
- 【動態規劃】編輯距離
- 【動態規劃】導彈攔截
- 【動態規劃】整數劃分
- 【動態規劃】吃西瓜
- 【動態規劃】找啊找啊找GF
- 【動態規劃】關鍵子工程
- 【動態規劃】機器分配
- 【動態規劃】硬幣找零
- 【動態規劃】物品裝箱問題
- 【動態規劃】質數取石子
- 【動態規劃】打水漂
- 【動態規劃】Maximum sum
- ☆【動態規劃】木馬級守護進程
- 【動態規劃】逃亡的準備
- 【動態規劃】最大加權矩形
- 【動態規劃】開心的金明
- 第二章 项目管理模型
- 软件开发工期估算系列(7)——規模見積もりの女王様「FP見積もり」【後編】(内附FP简易算法示例)
- 记录socket函数调用分析
- XML 根级别上的数据无效。 行 1,位置 1
- STL sort用法
- 【動態規劃】飆車
- struts2 Action中获取request, response,Session对象的方法
- POJ1887 Testing the CATCHER 最大下降子序列 DP
- asp.net成员资格与角色管理使用和配置
- com,ole,atl,activex的区别和联系
- ActiveX,OLE,COM之间的关系
- ASCII码表 上传博客收藏下
- 高效编写Java代码的几条建议
- css布局常用规范