今天我们来讲 Dance Dance Revolution这题

本题原网址

注意本题为多组输入输出,直到输入单个零而止(题面有点小问题)

很明显,此题为一道动态规划题(请不要妄想用贪心算法过这题,尽管你可能可以过样例,但是面对你的依然是WA),首先要存一个cost数组,用于存储从i号点到j号点的花费,存储过程如下

  1. int cost[5][5];
  2. void cost_put()
  3. {
  4. for(int i=0;i<=4;i++)cost[i][i]=1;
  5. for(int i=1;i<=3;i++)cost[i][i+1]=cost[i+1][i]=3;
  6. cost[4][1]=cost[1][4]=3,cost[3][1]=cost[1][3]=cost[2][4]=cost[4][2]=4;
  7. for(int i=1;i<=4;i++)cost[0][i]=cost[i][0]=2;
  8. }

存储完后,就该想想状态的描述,很显然,我们不仅需要描述他左脚和右脚的位置,还需要描述已经踩到了第几个音符。

因此要开一个三维的dp数组,\(dp[i][j][k]\)表示踩完第i个后,左脚在i号点,右脚在j号点,所需的最小花费。

想好了状态后,接着初始化,过程如下

  1. scanf("%d",&x);
  2. for(int i=1;i<=100000;i++)
  3. for(int j=0;j<=4;j++)
  4. for(int k=0;k<=4;k++)
  5. dp[i][j][k]=1e9;
  6. dp[0][0][0]=0;dp[1][x][0]=dp[1][0][x]=2;

该想转移方程了,在纸上画一画,很容易想到如下的转移方程(注意以下两个方程的细微差别)

  1. dp[tot][x][i]=min(dp[tot-1][j][i]+cost[x][j],dp[tot][x][i]);
  2. //正准备踩第i个,此时左脚踩到要踩的点,右脚踩在i号点上,所需的最小花费
  3. dp[tot][i][x]=min(dp[tot-1][i][j]+cost[x][j],dp[tot][i][x]);
  4. //正准备踩第i个,此时右脚踩到要踩的点,左脚踩在i号点上,所需的最小花费

想到这里已经没有什么可以难倒你了,但是有以下几点要注意:

2.\(dp\)数组和\(ans\)变量的初始值一定要设成极大值,因为要取最小值(算最小的花费值当然是取最小值)

3.最后\(ans\)一定取值时要在除去\(dp[tot][0][0],dp[tot][1][1],dp[tot][2][2],dp[tot][3][3],dp[tot][4][4]\)(\(tot\)为歌曲总长度)这几个状态的答案,这些状态违反了题目中两脚不可以同时踩在同一点的规则

完整代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int x,cost[5][5],dp[100010][5][5],tot=1,ans=1e9;
  4. void cost_put()
  5. {
  6. for(int i=0;i<=4;i++)cost[i][i]=1;
  7. for(int i=1;i<=3;i++)cost[i][i+1]=cost[i+1][i]=3;
  8. cost[4][1]=cost[1][4]=3,cost[3][1]=cost[1][3]=cost[2][4]=cost[4][2]=4;
  9. for(int i=1;i<=4;i++)cost[0][i]=cost[i][0]=2;
  10. }
  11. int main()
  12. {
  13. cost_put();
  14. while(true)
  15. {
  16. scanf("%d",&x);
  17. if(x==0)break;
  18. tot=1;ans=1e9;
  19. for(int i=1;i<=100000;i++)
  20. for(int j=0;j<=4;j++)
  21. for(int k=0;k<=4;k++)
  22. dp[i][j][k]=1e9;
  23. dp[0][0][0]=0;dp[1][x][0]=dp[1][0][x]=2;
  24. //初始化
  25. while(x!=0)
  26. {
  27. scanf("%d",&x);
  28. tot++;
  29. for(int i=0;i<=4;i++)
  30. for(int j=0;j<=4;j++)
  31. dp[tot][x][i]=min(dp[tot-1][j][i]+cost[x][j],dp[tot][x][i]);
  32. for(int i=0;i<=4;i++)
  33. for(int j=0;j<=4;j++)
  34. dp[tot][i][x]=min(dp[tot-1][i][j]+cost[x][j],dp[tot][i][x]);
  35. }
  36. //转移
  37. tot--;
  38. for(int i=0;i<=4;i++)
  39. for(int j=0;j<=4;j++)
  40. if(i!=j)ans=min(ans,dp[tot][i][j]);
  41. //统计答案
  42. printf("%d\n",ans);
  43. }
  44. return 0;
  45. }

Dance Dance Revolution的更多相关文章

  1. UVA 1291 十四 Dance Dance Revolution

    Dance Dance Revolution Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  2. [LA] 2031 Dance Dance Revolution

    Dance Dance Revolution Time limit: 3.000 seconds Mr. White, a fat man, now is crazy about a game nam ...

  3. 递推DP UVA 1291 Dance Dance Revolution

    题目传送门 题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少分析:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程: ...

  4. 2000 Asia shanghai Dance Dance Revolution

    思路:dp[i][x][y]表示第i个序列中,右脚在x位置,左脚在y位置时,其最小花费. 那么dp[i][x][y]=min(dp[i-1][a[i]][y]+cost[a[i]][x],dp[i-1 ...

  5. UVA 1291 Dance Dance Revolution(DP)

    意甲冠军:跳舞机有一个上5积分,分别central, top, bottom, left, right分,区区足站立还是需要1点物理,从一个单纯的脚central点上须要2点体力,从一个点上移动到相邻 ...

  6. UVALive - 2031 Dance Dance Revolution 三维dp

    题目大意:有一个胖子在玩跳舞机.刚開始的位置在(0,0).跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则 1.假设从0位置移动到随意四个位置,消耗能量2 2.假设从非0位置跳到相邻 ...

  7. TCP/UDP端口列表

    http://zh.wikipedia.org/wiki/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1%A8 TCP/UDP端口列表     本条目可通过翻译外语维 ...

  8. LA 2031

    Mr. White, a fat man, now is crazy about a game named ``Dance, Dance, Revolution". But his danc ...

  9. HTML简单介绍及常见元素

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

随机推荐

  1. linux(centos8):sed命令的应用例子

    一,sed命令的用途 sed是Linux下一款功能强大的非交互流式文本编辑器, 可以对文本文件进行增.删.改.查等操作, 支持按行.按字段.按正则匹配文本内容. 说明:刘宏缔的架构森林是一个专注架构的 ...

  2. css变量复用 全局变量-局部变量

    前言 简单使用场景:同一套后台系统有多套主题的情况下,主题色作为一个最常用到的可复用的颜色,非常有必要像js的全局变量一样存在全局变量中以作复用,之前我第一个想到的是sass的变量声明,未曾想到css ...

  3. vue-awesome-swiper ---移动端h5 swiper 和 tab 栏选项联动效果实现

    很久之前做小程序时有个类似每日优鲜里储值卡充值界面里的 卡轮播和价格tab栏联动效果,当时觉得新鲜做出来之后也没当回事.直到今天又遇到了一个类似的功能,所以想着总结经验. 实现效果如下图: 图解:点击 ...

  4. 浏览器缓存引起的bug总结

    缓存原理 浏览器缓存分为强缓存和协商缓存 先检查是否过期,没有过期直接使用本地缓存.如果过期,查看是否使用协商缓存 协商缓存流程: 后端返回headers: ETag: W/"1e3-175 ...

  5. pip安装与使用

    介绍 pip是python包管理工具,提供了对python包的查找,下载,安装,卸载功能. 安装 检查是否安装 pip --version 安装 curl https://bootstrap.pypa ...

  6. eclipse安装报错

    例如这样 原因是被墙了 个人搭**后完美解决

  7. Redis---00概述

    一.什么是Redis? 1.概念: 是一个由Salvatore Sanfilippo写的key-value存储系统.是一个典型的NoSQL数据库, 2.特点: ①:数据是存储在内存中的 ②:是一个ke ...

  8. Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)

    1. 安装Gerrit-2.9.5版本(Ubuntu) Gerrit版本:Gerrit-2.9.5.war 操作系统:Ubuntu 16.04.3 JAVA环境:java version " ...

  9. .NET CORE 下如何使用国产数据库进行 开发

    主流国产数据库 随着贸易战的升级 ,自主研发和知识产权也是一个大的趋势,达梦和人大金仓是国产数据库中比较主流的 1.达梦数据库 更接近Oracle,更偏向自主研发,对开发人员友好度不如金仓 达梦公司在 ...

  10. 优雅手撕bind函数(面试官常问)

    优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...