题目大意:有一个胖子在玩跳舞机。刚開始的位置在(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.两仅仅脚踩的数字和当前的数字不一样

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

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 50010
#define INF 0x3f3f3f3f
int dp[5][5][maxn];
int seq[maxn];
int strength[2] = {4,3};
int n; int solve() {
memset(dp, 0x3f, sizeof(dp));
dp[0][seq[0]][0] = dp[seq[0]][0][0] = 2; for(int i = 1; i < n; i++) {
for(int j = 0; j < 5; j++) {
if(dp[j][seq[i-1]][i-1] != INF) { if(j == 0) {
if(seq[i] != seq[i-1])
dp[seq[i]][seq[i-1]][i] = dp[j][seq[i-1]][i-1] + 2; if(seq[i] == seq[i-1])
dp[j][seq[i-1]][i] = dp[j][seq[i-1]][i-1] + 1;
else
dp[j][seq[i]][i] = dp[j][seq[i-1]][i-1] + strength[(seq[i-1] + seq[i]) % 2];
}
else if(j == seq[i] || seq[i-1] == seq[i])
dp[j][seq[i-1]][i] = min(dp[j][seq[i-1]][i],dp[j][seq[i-1]][i-1] + 1);
else {
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]);
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]);
}
} if(dp[seq[i-1]][j][i-1] != INF) {
if(j == 0) {
if(seq[i] != seq[i-1])
dp[seq[i]][seq[i-1]][i] = dp[seq[i-1]][j][i-1] + 2; if(seq[i] == seq[i-1])
dp[seq[i-1]][j][i] = dp[seq[i-1]][j][i-1] + 1;
else
dp[seq[i]][j][i] = dp[seq[i-1]][j][i-1] + strength[(seq[i-1] + seq[i]) % 2];
} if(j == seq[i] || seq[i-1] == seq[i])
dp[seq[i-1]][j][i] = min(dp[seq[i-1]][j][i],dp[seq[i-1]][j][i-1] + 1);
else {
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]);
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]);
}
}
}
}
int ans = INF;
for(int i = 0; i < 5; i++)
ans = min(min(ans, dp[seq[n-1]][i][n-1]), dp[i][seq[n-1]][n-1]); return ans;
} int main() {
n = 0;
while(scanf("%d", &seq[n]) != EOF && seq[n++]) {
while(scanf("%d", &seq[n]) && seq[n])
n++;
printf("%d\n", solve());
n = 0;
}
return 0;
}

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. Scapy介绍官方文档翻译

    关于Scapy Scapy为何如此特别 高速的报文设计 一次探測多次解释 Scapy解码而不解释 高速展示Quick demo 合理的默认值 学习Python 本人英文水平有限,翻译不当之处,请參考官 ...

  2. JAVA实现将GeoHash转化为相应的经纬度坐标

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/50568428 http://www.llwjy.com/blogdetail/f ...

  3. httpurlconnection get String

    public static String getJSON(String url, int timeout) { HttpURLConnection c = null; try { long reque ...

  4. POJ-3984-迷宫问题-BFS(广搜)-手写队列

    题目链接:id=3984">http://poj.org/problem? id=3984 这个本来是个模板题,可是老师要去不能用STL里的queue,得自己手写解决.ORZ....看 ...

  5. EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType

    问题原因,EF当前版本没有该方法,将EF版本升级即可. 1.packages.config <package id="EntityFramework" version=&qu ...

  6. scikit-learn系列之如何存储和导入机器学习模型

    scikit-learn系列之如何存储和导入机器学习模型   如何存储和导入机器学习模型 找到一个准确的机器学习模型,你的项目并没有完成.本文中你将学习如何使用scikit-learn来存储和导入机器 ...

  7. hdoj--1272--小希的迷宫(并查集)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. 21.QT二进制文件

    #include "mainwindow.h" #include <QApplication> #include <QFile> #include < ...

  9. Java中的作用域有哪些

    在Java语言中,变量的类型主要有3种:成员变量.静态变量和局部变量 首先说静态变量跟局部变量 静态变量不依赖于特定的实例,而是被所有实例共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配 ...

  10. JQuery (总结)

    延迟触发事件 Ajax异步请求数据 Jquery事件: Focus获得焦点 blur失去焦点 Change内容在变化的时候 Click点击事件 ---------------------------- ...