题目大意:有一个胖子在玩跳舞机。刚開始的位置在(0,0)。跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则

1.假设从0位置移动到随意四个位置,消耗能量2

2.假设从非0位置跳到相邻的位置,如1跳到2或4,消耗能量3

3.假设从非0位置跳到对面的位置。如2跳到4。消耗能量4

4.假设跳同一个位置,消耗能量1

5.两仅仅脚不能在同一个位置

解题思路:这题事实上非常水。直接暴力就能够攻克了,讨论全部情况,用dp[i][j][k]表示跳第k个数字。左脚在i这个位置。右脚在j这个位置时所消耗的能量,接着分类讨论

1.假设当中一仅仅脚在0上的情况

2.当中一仅仅脚踩的数字和当前要跳的数字一样

3.两仅仅脚踩的数字和当前的数字不一样

三种情况,分别在细分就可以,详细看代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. #define maxn 50010
  6. #define INF 0x3f3f3f3f
  7. int dp[5][5][maxn];
  8. int seq[maxn];
  9. int strength[2] = {4,3};
  10. int n;
  11. int solve() {
  12. memset(dp, 0x3f, sizeof(dp));
  13. dp[0][seq[0]][0] = dp[seq[0]][0][0] = 2;
  14. for(int i = 1; i < n; i++) {
  15. for(int j = 0; j < 5; j++) {
  16. if(dp[j][seq[i-1]][i-1] != INF) {
  17. if(j == 0) {
  18. if(seq[i] != seq[i-1])
  19. dp[seq[i]][seq[i-1]][i] = dp[j][seq[i-1]][i-1] + 2;
  20. if(seq[i] == seq[i-1])
  21. dp[j][seq[i-1]][i] = dp[j][seq[i-1]][i-1] + 1;
  22. else
  23. dp[j][seq[i]][i] = dp[j][seq[i-1]][i-1] + strength[(seq[i-1] + seq[i]) % 2];
  24. }
  25. else if(j == seq[i] || seq[i-1] == seq[i])
  26. dp[j][seq[i-1]][i] = min(dp[j][seq[i-1]][i],dp[j][seq[i-1]][i-1] + 1);
  27. else {
  28. dp[seq[i]][seq[i-1]][i] = min(dp[j][seq[i-1]][i-1] + strength[(j + seq[i]) % 2], dp[seq[i]][seq[i-1]][i]);
  29. dp[j][seq[i]][i] = min(dp[j][seq[i-1]][i-1] + strength[(seq[i-1] + seq[i] ) % 2], dp[j][seq[i]][i]);
  30. }
  31. }
  32. if(dp[seq[i-1]][j][i-1] != INF) {
  33. if(j == 0) {
  34. if(seq[i] != seq[i-1])
  35. dp[seq[i]][seq[i-1]][i] = dp[seq[i-1]][j][i-1] + 2;
  36. if(seq[i] == seq[i-1])
  37. dp[seq[i-1]][j][i] = dp[seq[i-1]][j][i-1] + 1;
  38. else
  39. dp[seq[i]][j][i] = dp[seq[i-1]][j][i-1] + strength[(seq[i-1] + seq[i]) % 2];
  40. }
  41. if(j == seq[i] || seq[i-1] == seq[i])
  42. dp[seq[i-1]][j][i] = min(dp[seq[i-1]][j][i],dp[seq[i-1]][j][i-1] + 1);
  43. else {
  44. dp[seq[i]][seq[i-1]][i] = min(dp[seq[i-1]][j][i-1] + strength[(j + seq[i]) % 2], dp[seq[i]][seq[i-1]][i]);
  45. dp[seq[i]][j][i] = min(dp[seq[i-1]][j][i-1] + strength[(seq[i-1] + seq[i] ) % 2], dp[seq[i]][j][i]);
  46. }
  47. }
  48. }
  49. }
  50. int ans = INF;
  51. for(int i = 0; i < 5; i++)
  52. ans = min(min(ans, dp[seq[n-1]][i][n-1]), dp[i][seq[n-1]][n-1]);
  53. return ans;
  54. }
  55. int main() {
  56. n = 0;
  57. while(scanf("%d", &seq[n]) != EOF && seq[n++]) {
  58. while(scanf("%d", &seq[n]) && seq[n])
  59. n++;
  60. printf("%d\n", solve());
  61. n = 0;
  62. }
  63. return 0;
  64. }

UVALive - 2031 Dance Dance Revolution 三维dp的更多相关文章

  1. [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 ...

  2. 递推DP UVA 1291 Dance Dance Revolution

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

  3. Dance Dance Revolution

    今天我们来讲 Dance Dance Revolution这题 本题原网址 注意本题为多组输入输出,直到输入单个零而止(题面有点小问题) 很明显,此题为一道动态规划题(请不要妄想用贪心算法过这题,尽管 ...

  4. UVA 1291 十四 Dance Dance Revolution

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

  5. 三维dp&codeforce 369_2_C

    三维dp&codeforce 369_2_C 标签: dp codeforce 369_2_C 题意: 一排树,初始的时候有的有颜色,有的没有颜色,现在给没有颜色的树染色,给出n课树,用m种燃 ...

  6. P1006 传纸条(二维、三维dp)

    P1006 传纸条 输入输出样例 输入 #1 复制 3 3 0 3 9 2 8 5 5 7 0 输出 #1 复制 34 说明/提示 [限制] 对于 30% 的数据,1≤m,n≤10: 对于 100% ...

  7. UVA 1291 Dance Dance Revolution(DP)

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

  8. 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 ...

  9. UVALive - 3942 Remember the Word[Trie DP]

    UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...

随机推荐

  1. Android scrollTo() scrollBy() Scroller解说及应用

    版本号:1.0  日期:2014.6.17  2014.6.18 版权:© 2014 kince 转载注明出处   scrollTo() .scrollBy()及 Scroller在视图滑动中常常使用 ...

  2. nyoj Wythoff Game(暴力枚举)

    Wythoff Game  ms |   KB 描写叙述 近期ZKC同学在学博弈,学到了一个伟大的博弈问题--威佐夫博弈. 相信大家都学过了吧?没学过?没问题.我将要为你讲述一下这个伟大的博弈问题. ...

  3. codecombat之KithGard地牢19-37关代码分享

    codecombat中国游戏网址:http://www.codecombat.cn/ 全部代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 ...

  4. JavaScript的那些坑之变量提升

    想总结一下JS的变量提升特性,都是由于一道题.先上题. var name = 'World!'; (function () { if (typeof name === 'undefined') { v ...

  5. nyoj--74--小学生算术(水)

    小学生算术 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 很多小学生在学习加法时,发现"进位"特别容易出错.你的任务是计算两个三位数在相加时需要多少 ...

  6. Node.js:连接 MySQL

    ylbtech-Node.js:连接 MySQL 1.返回顶部 1. Node.js 连接 MySQL 本章节我们将为大家介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作. 如果你 ...

  7. jdk7与jdk8环境共存与切换

    1,先安装jdk7,配置环境变量JAVA_HOME,然后安装jdk8. 2,安装jdk8后,JAVA_HOME指向未做修改,执行java -version显示还是以前的jdk7版本信息, 3,接下来我 ...

  8. SQL Server 忘记登录账号解决方法

    [1] 停止SQL Server 服务 和 SQL Server Agent 服务 [2] 以管理员身份打开命令行,单用户模式启动服务.(在单用户模式下启动 SQL Server 可使计算机本地 Ad ...

  9. Mediator 基于内存的发布订阅

    Github Mediator 使用方法 /// <summary> /// 返回值 BaseEntity /// </summary> public class Ping1 ...

  10. C# 读取硬盘信息 ManagementClass类

    一.在很多情况下,你可能都需要得到微机的硬件信息.需要加上下面的这句话: using System.Management; 获取硬件信息,需先知道硬件参数信息: Win32_Processor, // ...