• 3049 舞蹈家怀特先生


    3049 舞蹈家怀特先生

     

     时间限制: 1 s
     空间限制: 64000 KB
     题目等级 : 黄金 Gold 
     
     
    题目描述 Description

    怀特先生是一个大胖子。他很喜欢玩跳舞机(Dance Dance Revolution, DDR),甚至希望有一天人家会脚踏“舞蹈家怀特先生”。可惜现在他的动作根本不能称作是在跳舞,尽管每次他都十分投入的表演。这也难怪,有他这样的体型,玩跳舞机是相当费劲的。因此,他希望写一个程序来安排舞步,让他跳起来轻松一些,至少不要每次都汗流浃背。
      DDR的主要内容是用脚来踩踏板。踏板有四个方向的箭头,用1 (Up)、2 (Left)、3 (Down)、4 (Right)来代表,中间位置由0来代表。每首歌曲有一个箭头序列,游戏者必须按照或这个序列一次用某一只脚踩相应的踏板。在任何时候,两只脚都不能在同一踏板上,但可以同时待在中心位置0。
      每一个时刻,它必须移动而且只能移动他的一只脚去踩相应的箭头,而另一只脚不许移动。跳完一首曲子之后,怀特先生会计算他所消耗的体力。从中心移动到任何一个箭头耗费2单位体力,从任何一个箭头移动到相邻箭头耗费3单位体力,移动到相对的箭头(1和3相对,2和4相对)耗费4单位体力,而留在原地再踩一下只需要1单位。怀特先生应该怎样移动他的双脚(即,对于每个箭头,选一只脚去踩它),才能用最少的体力完成一首给定的舞曲呢?
      例如,对于箭头序列Left (2), Left (2), Up (1), Right (4),他应该分别用左、左、右、右脚去踩,总的体力耗费为2+1+2+3=8单位。

    输入描述 Input Description

    第一行N,表示有N个时刻 1<=N<=10000
    第二到n+1行,每行一个数,表示需要踩得版

    输出描述 Output Description

    一个数,最小消耗体力

    样例输入 Sample Input

    2

    1

    1

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    n<=10000

    动态规划,f[k][i][j] 表示跳了k布,左脚在i,右脚在j,的最小步数,

    所以分两种情况,要么左脚踩,要么右脚踩,

    f[i][j][a[i]] = min(f[i][j][a[i]],f[i-1][j][k]+move(a[i],k));
    f[i][a[i]][k] = min(f[i][a[i]][k],f[i-1][j][k]+move(a[i],j));(j,k∈(0,4))

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 
     7 int f[10010][5][5];
     8 int a[10010];
     9 int n,m,ans=99999999;
    10 
    11 int move(int a,int b)
    12 {
    13     if(a==b) return 1;
    14     if(a==0||b==0) return 2;
    15     if(a%2==b%2) return 4;
    16     return 3;
    17 }
    18 
    19 int main()
    20 {
    21     scanf("%d",&n);
    22     for (int i=1; i<=n; ++i)
    23         scanf("%d",&a[i]);
    24     memset(f,0x3f,sizeof(f));
    25     f[0][0][0] = 0;
    26     for (int k=1; k<=n; ++k)
    27         for (int i=0; i<=4; ++i)
    28             for (int j=0; j<=4; ++j)
    29             {
    30                 f[k][i][a[k]] = min(f[k][i][a[k]],f[k-1][i][j]+move(a[k],j));
    31                 f[k][a[k]][j] = min(f[k][a[k]][j],f[k-1][i][j]+move(a[k],i));
    32             }
    33     for (int i=0; i<=4; ++i)
    34         for (int j=0; j<=4; ++j)
    35             ans = min(ans,f[n][i][j]);
    36     printf("%d",ans);
    37     return 0;
    38 }
  • 相关阅读:
    小结
    五种常见的 PHP 设计模式
    php克隆 自动加载
    小知识点
    php抽象 与接口
    php静态
    iOS开发零碎笔记
    iOS开发错误日志
    Objective-C:Foundation框架-常用类-NSObject
    Objective-C:Foundation框架-常用类-NSDate
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6914275.html
Copyright © 2020-2023  润新知