今天我们来讲 Dance Dance Revolution这题

本题原网址

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

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

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

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

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

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

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

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

dp[tot][x][i]=min(dp[tot-1][j][i]+cost[x][j],dp[tot][x][i]);
//正准备踩第i个,此时左脚踩到要踩的点,右脚踩在i号点上,所需的最小花费
dp[tot][i][x]=min(dp[tot-1][i][j]+cost[x][j],dp[tot][i][x]);
//正准备踩第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\)为歌曲总长度)这几个状态的答案,这些状态违反了题目中两脚不可以同时踩在同一点的规则

完整代码:

#include<bits/stdc++.h>
using namespace std;
int x,cost[5][5],dp[100010][5][5],tot=1,ans=1e9;
void cost_put()
{
for(int i=0;i<=4;i++)cost[i][i]=1;
for(int i=1;i<=3;i++)cost[i][i+1]=cost[i+1][i]=3;
cost[4][1]=cost[1][4]=3,cost[3][1]=cost[1][3]=cost[2][4]=cost[4][2]=4;
for(int i=1;i<=4;i++)cost[0][i]=cost[i][0]=2;
}
int main()
{
cost_put();
while(true)
{
scanf("%d",&x);
if(x==0)break;
tot=1;ans=1e9;
for(int i=1;i<=100000;i++)
for(int j=0;j<=4;j++)
for(int k=0;k<=4;k++)
dp[i][j][k]=1e9;
dp[0][0][0]=0;dp[1][x][0]=dp[1][0][x]=2;
//初始化
while(x!=0)
{
scanf("%d",&x);
tot++;
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
dp[tot][x][i]=min(dp[tot-1][j][i]+cost[x][j],dp[tot][x][i]);
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
dp[tot][i][x]=min(dp[tot-1][i][j]+cost[x][j],dp[tot][i][x]);
}
//转移
tot--;
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
if(i!=j)ans=min(ans,dp[tot][i][j]);
//统计答案
printf("%d\n",ans);
} return 0;
}

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. PHP 超级全局变量 $_GET

    https://www.php.cn/php/php-superglobals.html https://m.php.cn/code/11853.html

  2. go内建方法 new和make区别

    package mainimport ( "fmt" "reflect")func main() { // make函数 //makeSlice() // 创建 ...

  3. 使用creata-react-app脚手架创建react项目时非常慢的问题

    创建react项目必须要有下面两个步骤 cnpm install -g create-react-app  //创建react全局变量 create-react-app my-app //创建一个re ...

  4. 没事学学KVM(一)

    学习KVM肯定要找来一台虚机来学习呀,通过VMware workstation创建虚机,现在的电脑CPU,包括INTER,AMD都支持,公司发的电脑CPU为inter,通过开启inter VT-X可在 ...

  5. 深信服edr 2020HW行动0day 漏洞细节

    漏洞1 一下4个漏洞触发都在其他文件,这里只进行漏洞点的分析. 漏洞点tool\log\c.php 启动c.php大约140行-148行 这里执行了两个方法 show_form 与main 这里追踪s ...

  6. 线程池CachedThreadPool

    没有核心线程,只有非核心线程,并且每个非核心线程空闲等待的时间为60s,采用SynchronousQueue队列 由于maximumPoolSize是无界的,所以如果线程处理任务速度小于提交任务的速度 ...

  7. JS删除微博

    昨天晚上找回了10年注册的微博,现在瞅瞅,转发过很多傻吊的微博,关注了一堆营销号,不忍直视,动手删吧!开玩笑的,怎么可能手动! 查看自己的所有微博,F12----->console,负责下面代码 ...

  8. ABP 数据访问 - IRepository 仓储

    ABP系列,这个系列来的比较晚,很多大佬其实已经分析过,为什么现在我又来一轮呢? 1.想自己来完整的学习一轮ABP 2.公司目前正在使用ABP,准备迁移Core 基于以上的目的,开始这个系列 ABP ...

  9. STM32CubeIDE下载安装-GPIO基本配置操作-Debug调试(基于CMSIS DAP Debug)

    1.在ST官网下载STM32CubeIDE而不是STM32CubeMX,并且STM32CubeIDE是免费的.(STM32CubeIDE不支持中文路径,不然编译会出错) 2.如果你用的是keil开发环 ...

  10. sdsd

    自本人拥有手机以来,由于有存短信的特殊嗜好,得出以下不完全统计: 累计中奖93次,资金共计2260万元(人民币),另有各种iphone68部, 电脑36台,轿车27辆,收到法院传票93张,被大学录取5 ...