【dp动态规划】飙车

原创 2016年06月01日 23:34:55

【问题描述】
[说明]此题中出现的所有数字均为整数 [背景]有天SubRaY发现宇宙新秀在玩一个游戏叫Need For Speed(什么?连大名鼎鼎的极品飞车都没听说过..),他发现宇宙新秀总是逆行,于是出现以下对话: SubRaY:你怎么老是在逆行道跑.. 宇宙新秀:近! SubRaY:你就不怕撞车.. 宇宙新秀:你提前写个程序计算一下不就完了! SubRaY:…… SubRaY实在不会写这个程序,于是他交给你.. [题目描述]已知公路总长L米,一共有K个赛道,你的赛车总是和公路上其他的普通的车走相反的方向,并且所有的车每秒沿赛道行驶1m(具体看图)(宇宙新秀:我的Evo IV怎么这么烂….). 问题是:跑到终点最少撞多少次车? 我们简化一下模型,画一个(L+1)*K的网格,设所有的车都是点,并且每秒末都会出现在这个网格的某个顶点上.公路上其他的车都以固定的1m/s的速度自上而下行驶,而你的跑车自下而上行驶,并且每秒可以从一个点行驶到它上方\左上方\右上方的点(假设飘移不浪费时间,具体请看图). 我们假设,撞车不会使车损坏,不会使车减速(宇宙新秀:我的Evo IV怎么这么强~~) 对于撞车的设定:当每秒末你的车和另外一辆车处在同一点上时,算撞车;你的车和另一辆车迎面开过来,算撞车.具体请看下图:
这里写图片描述
假设一开始你可以选择任意一个赛道开始比赛,要求你写一个程序,计算到达终点至少要撞多少次车. 对于上边的例子,只要开始选择第三赛道开始跑,然后一路向北,就可以不撞车而到达终点

【问题分析】
很基础的动归题,用F[i][j]表示当车子行驶到第i行第j列时能获得的最少碰撞次数,那么因为已知有三种走法,故可以写出方程式
F[i][j]=min(F[i-2][j]+c[i-1][j],min(F[i-2][j-1],F[i-2][j+1]))+c[i][j]
因为如果你是漂移的话,在漂移过程中是不会受到碰撞,根据运动的相对性,我们可以把赛车的速度设为2,然后假设其他车辆全都不许动!(我们都是木头人,祝oier们6.1快乐),再加上一些判定是否超出边境的情况即可。

我真是业界良心啊 。。。 希望能对将来在OI里沉浮的学弟学妹们有所帮助。

#include <iostream>
#include <cstdio>
#include <climits>
using namespace std;
const int N=101;
const int K=11;
const int inf=INT_MAX;
int n,k,ans;  bool c[N][K];  int F[N][K];
void read()
{
    int i,j;  char temp;
    scanf("%d%d",&n,&k);
    getchar();
    for (i=n;i>=1;i--)
    {
        for (j=1;j<=k;j++)
        {
            temp=getchar();
            if (temp=='1')
                c[i][j]=1;
        }
        getchar();
    }
    if (n%2==1)  n--;
    for (i=1;i<=n;i++)
        for (j=1;j<=k;j++)
            F[i][j]=inf;
    ans=inf;
    return;
}
void dp()
{
    int i,j,l;  bool flag;
    for (i=2;i<=n;i+=2)
        for (j=1;j<=k;j++)
        {
            flag=0;
            if (c[i][j])  flag=1;
            if (j>1)
                F[i][j]=min(F[i][j],F[i-2][j-1]+flag);
            if (j<k)
                F[i][j]=min(F[i][j],F[i-2][j+1]+flag);
            F[i][j]=min(F[i][j],F[i-2][j]+c[i-1][j]+flag);
        }
    for (i=1;i<=k;i++)
        ans=min(ans,F[n][i]);
    printf("%d\n",ans);
    return;
}
int main()
{
    freopen("nfs.in","r",stdin);
    freopen("nfs.out","w",stdout);
    read();
    dp();
    return 0;
}
版权声明:QwQ By 20150112 QwQ

【DP算法篇之初学】LIS\LCS\二维DP\带条件DP

最近参加2016华为软件精英挑战赛,题目也比较直接,就是求过定点的最短路。这题和以前练得不一样,感觉是不是要用DP(动态规划)。可是对于DP,算法,我还是啥都不懂,于是好好补补。 先是参考这篇博文...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年03月14日 20:57
  • 2204

android dp深度解析

我转载地方的连接:http://zhangkun716717-126-com.iteye.com/blog/1772696  当笔记记录一下  dip: device independent pix...
  • hunanqi
  • hunanqi
  • 2016年07月11日 17:27
  • 662

Android中dp的概念

以前刚接触Android时就知道一个概念:由于android设备种类繁多,屏幕分辨率的ppi(pixels per inche,有时也叫dpi dots per inch)也各有不同,因此定义大小时如...
  • glorydream2015
  • glorydream2015
  • 2015年07月05日 18:22
  • 863

状态压缩dp入门 (poj3254 Corn Fields)

题目链接:http://poj.org/problem?id=3254 题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多...
  • y990041769
  • y990041769
  • 2014年04月28日 19:10
  • 19059

dp入门———列基本的状态和状态方程

1;了解一下DP的基本原理 我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解。 入门网站;http://www.360doc.com/content/13/0601/00/80...
  • zw1996
  • zw1996
  • 2016年08月08日 20:54
  • 738

【数据结构与算法】 DP 动态规划 介绍

最近在看算法导论。 DP全称是dynamic programming,这里programming不是编程,是一个表格保存之前的结果。 DP 是一种编程思想,主要用于解决最优解类型的问题。 其思路是为了...
  • u010900754
  • u010900754
  • 2017年02月13日 00:42
  • 836

安卓手机屏幕分辨率与dip、dp、sp的区别

以下文章知其然不知所其然,只能先看看,还有,现在的分辨率除了640x480这几种,还有720x1080这些,所有不一定就是 HVGA屏density=160;QVGA屏density=120WVGA屏...
  • cdnight
  • cdnight
  • 2015年06月10日 10:03
  • 5803

树形DP总结,持续更新

树形DP总结,持续更新
  • Dacc123
  • Dacc123
  • 2016年01月03日 18:09
  • 370

浅谈android 屏幕适配中 dp和sp的区别

欢迎转载 转载注明出处关于dp和sp的具体区别 看网上文章少有深入涉及 介于一次面试被问到:sp和dp的关系是什么?例如一个控件宽度为 15dp 或者 15sp 在大部分情况下是一样的,那什么情况下...
  • u010181592
  • u010181592
  • 2015年11月24日 14:30
  • 6958

概率DP入门小结

说是概率DP,其实主要是求概率和期望的问题 说到DP总要有状态,每种状态可能有多种子状态 一般的DP是这样:在DP过程中,当前状态必然是由多个子状态中的最优的转移而来 所以一般的DP求的是最优的...
  • tomorrowtodie
  • tomorrowtodie
  • 2016年08月27日 20:41
  • 539
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【dp动态规划】飙车
举报原因:
原因补充:

(最多只允许输入30个字)