题目大意:有一个胖子在玩跳舞机。刚開始的位置在(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. Apache负载均衡与Tomcat集群配置学习(Windows环境)

    本文主要参考自http://www.iteye.com/topic/985404?dhcc,经由实际操作配置操并记录而成. 由于最近的一个Java开发项目用到了Tomcat中间件作为web服务器,刚开 ...

  2. servletConfig和ServletContext 以及servletContextListener介绍

    <servlet>     <servlet-name>BeerParamTests</servlet-name>     <servlet-class> ...

  3. 为代码减负之&lt;三&gt;视图(SQL)

    在设计数据库时为了降低数据冗余.一般都会依照三范式去设计,但有时我们在查询时须要通过一字段获取跟这 个字段相关联的好几个字段.可是他们又分布在不同的表中,这时候假设依照正常途径走的话须要同一时候查询好 ...

  4. ANT公布SVN WEB项目到TOMCAT以及利用post-commit自己主动提交编译更新

    开发者在本地提交更新到SVNserver后.往往须要測试人员又一次測试.为了将更新内容即时反映到測试server.能够利用post-commit脚本将SVN更新同步到測试server中. (1)利用S ...

  5. oracle如何创建数据库

    第一步: 从Windows桌面执行“开始”→“Database Configuration Assistant”命令,打开Database Configuration Assistant对话框的欢迎界 ...

  6. MySQL 5.7 zip 文件安装过程

    1.下载路径 https://dev.mysql.com/downloads/mysql/   有账号登陆下载, 没有账号:no thanks;just start my download   2.解 ...

  7. Tomcat 初探(三)多项目部署

    起因 昨天房东找我说最近物价飞涨,要涨我房租,混不下去了,得要求老板涨工资.一大清早就去找老板,老板看了看我,让我发布先两个网站:一个前台网站 frontend,给用户用:一个后台管理网站 backe ...

  8. 利用jqueryzoom实现图片放大镜效果

    在你的页面中包含 jqzoom.css <link rel="stylesheet" href="your_path/jqzoom.css" type=& ...

  9. 安装全局可执行的gulp

    gulp需要作为项目的开发依赖(devDependencies)安装,全局安装了gulp是无法执行项目的,不单单需要全局安装 gulp:npm install gulp -g,也需要作为项目的开发依赖 ...

  10. ZBrush中Nudge推动笔刷介绍

    本文我们来介绍Nudge推动笔刷,该笔刷在使用时能够产生旋转涂抹的效果,Nudge笔刷允许您在模型表面移动顶点,而这些移动的顶点仍然停留在模型的原来的表面,它与Move笔刷还是不同的,利用Move笔刷 ...