UVALive - 2031 Dance Dance Revolution 三维dp
题目大意:有一个胖子在玩跳舞机。刚開始的位置在(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的更多相关文章
- [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 ...
- 递推DP UVA 1291 Dance Dance Revolution
题目传送门 题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少分析:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程: ...
- Dance Dance Revolution
今天我们来讲 Dance Dance Revolution这题 本题原网址 注意本题为多组输入输出,直到输入单个零而止(题面有点小问题) 很明显,此题为一道动态规划题(请不要妄想用贪心算法过这题,尽管 ...
- UVA 1291 十四 Dance Dance Revolution
Dance Dance Revolution Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- 三维dp&codeforce 369_2_C
三维dp&codeforce 369_2_C 标签: dp codeforce 369_2_C 题意: 一排树,初始的时候有的有颜色,有的没有颜色,现在给没有颜色的树染色,给出n课树,用m种燃 ...
- P1006 传纸条(二维、三维dp)
P1006 传纸条 输入输出样例 输入 #1 复制 3 3 0 3 9 2 8 5 5 7 0 输出 #1 复制 34 说明/提示 [限制] 对于 30% 的数据,1≤m,n≤10: 对于 100% ...
- UVA 1291 Dance Dance Revolution(DP)
意甲冠军:跳舞机有一个上5积分,分别central, top, bottom, left, right分,区区足站立还是需要1点物理,从一个单纯的脚central点上须要2点体力,从一个点上移动到相邻 ...
- 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 ...
- UVALive - 3942 Remember the Word[Trie DP]
UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...
随机推荐
- Scapy介绍官方文档翻译
关于Scapy Scapy为何如此特别 高速的报文设计 一次探測多次解释 Scapy解码而不解释 高速展示Quick demo 合理的默认值 学习Python 本人英文水平有限,翻译不当之处,请參考官 ...
- JAVA实现将GeoHash转化为相应的经纬度坐标
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/50568428 http://www.llwjy.com/blogdetail/f ...
- httpurlconnection get String
public static String getJSON(String url, int timeout) { HttpURLConnection c = null; try { long reque ...
- POJ-3984-迷宫问题-BFS(广搜)-手写队列
题目链接:id=3984">http://poj.org/problem? id=3984 这个本来是个模板题,可是老师要去不能用STL里的queue,得自己手写解决.ORZ....看 ...
- EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType
问题原因,EF当前版本没有该方法,将EF版本升级即可. 1.packages.config <package id="EntityFramework" version=&qu ...
- scikit-learn系列之如何存储和导入机器学习模型
scikit-learn系列之如何存储和导入机器学习模型 如何存储和导入机器学习模型 找到一个准确的机器学习模型,你的项目并没有完成.本文中你将学习如何使用scikit-learn来存储和导入机器 ...
- hdoj--1272--小希的迷宫(并查集)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 21.QT二进制文件
#include "mainwindow.h" #include <QApplication> #include <QFile> #include < ...
- Java中的作用域有哪些
在Java语言中,变量的类型主要有3种:成员变量.静态变量和局部变量 首先说静态变量跟局部变量 静态变量不依赖于特定的实例,而是被所有实例共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配 ...
- JQuery (总结)
延迟触发事件 Ajax异步请求数据 Jquery事件: Focus获得焦点 blur失去焦点 Change内容在变化的时候 Click点击事件 ---------------------------- ...