Dance Dance Revolution

Time limit: 3.000 seconds

Mr. White, a fat man, now is crazy about a game named ``Dance, Dance, Revolution". But his dance skill is
so poor that he could not dance a dance, even if he dances arduously every time. Does ``DDR" just mean him
a perfect method to squander his pounds? No way. He still expects that he will be regarded as ``Terpsichorean
White" one day. So he is considering writing a program to plan the movement sequence of his feet, so that he
may save his strength on dancing. Now he looks forward to dancing easily instead of sweatily.
``DDR" is a dancing game that requires the dancer to use his feet to tread on the points according to the
direction sequence in the game. There are one central point and four side points in the game. Those side points
are classified as top, left, bottom and right. For the sake of explanation, we mark them integers. That is, the
central point is 0, the top is 1, the left is 2, the bottom is 3, and the right is 4, as the figure below shows:

At the beginning the dancer's two feet stay on the central point. According to the direction sequence, the
dancer has to move one of his feet to the special points. For example, if the sequence requires him to move to
the top point at first, he may move either of his feet from point 0 to point 1 (Note: Not both of his feet). Also,
if the sequence then requires him to move to the bottom point, he may move either of his feet to point 3,
regardless whether to use the foot that stays on point 0 or the one that stays on point 1.
There is a strange rule in the game: moving both of his feet to the same point is not allowed. For instance, if
the sequence requires the dancer to the bottom point and one of his feet already sta ys on point 3, he should
stay the very foot on the same point and tread again, instead of moving the other one to point 3.
After dancing for a long time, Mr. White can calculate how much strength will be consumed when he moves
from one point to another. Moving one of his feet from the central point to any side points will consume 2
units of his strength. Moving from one side point to another adjacent side point will consume 3 units, such as
from the top point to the left point. Moving from one side point to the opposite side point will consume 4
units, such as from the top point to the bottom point. Yet, if he stays on the same point and tread again, he will
use 1 unit.
Assume that the sequence requires Mr. White to move to point 1 2 2 4. His feet may stays on
(point 0, point 0) (0, 1) (2, 1) (2, 1) (2, 4). In this couple of integers, the former number
represents the point of his left foot, and the latter represents the point of his right foot. In this way, he has to
consume 8 units of his strength. If he tries another pas, he will have to consume much more strength. The 8
units of strength is the least cost.

Input
The input file will consist of a series of direction sequences. Each direction sequence contains a sequence of
numbers. Ea ch number should either be 1, 2, 3, or 4, and each represents one of the four directions. A value
of 0 in the direction sequence indicates the end of direction sequence. And this value should be excluded from
the direction sequence. The input file ends if the sequence contains a single 0.
Output
For each direction sequence, print the least units of strength will be consumed. The result should be a single
integer on a line by itself. Any more white spaces or blank lines are not allowable.
Sample Input
1 2 2 4 0
1 2 3 4 1 2 3 3 4 2 0
0
Sample Output
8
22
Shanghai 2000-2001

题解:

线性动态规划。维护一个三维数组f[i][x][y]表示在第i步左脚在x,右脚在y消耗最小的体力。

注意初始化f=MAX_NUMBER。f[1][a[1]][0]=2;f[1][0][a[1]]=2;

动态转移方程:

f[i][a[i]][j]=min(f[i][a[i]][j],f[i-1][k][j]+effort(k,a[i]));

f[i][j][a[i]]=min(f[i][j][a[i]],f[i-1][j][k]+effort(k,a[i]));

代码:

 #include<stdio.h>
#include<string.h>
#include<stdbool.h>
int i,j,n,
a[],f[][][]; int
pre()
{
memset(a,,sizeof(a));
memset(f,,sizeof(f));
return ;
} int
init()
{
while(true)
{
n++;
scanf("%d",&a[n]);
if(a[n]==)
{
n--;
break;
}
} f[][a[]][]=;
f[][][a[]]=;
return ;
} int
max(int a,int b)
{
if(a>b) return(a);
else return(b);
} int
min(int a,int b)
{
if(a<b) return(a);
else return(b);
}
int
effort(int a,int b)
{
int p;
if((min(a,b)==)&&(max(a,b)!=)) return();
p=max(a,b)-min(a,b);
if(p== || p==) return();
if(p==) return();
if(p==) return();
} int
dp()
{
int i,j,k,mini;
for(i=;i<=n;i++)
for(j=;j<=;j++)
for(k=;k<=;k++)
{
f[i][a[i]][j]=min(f[i][a[i]][j],f[i-][k][j]+effort(k,a[i]));
f[i][j][a[i]]=min(f[i][j][a[i]],f[i-][j][k]+effort(k,a[i]));
} mini=;
for(i=;i<=;i++)
mini=min(mini,min(f[n][a[n]][i],f[n][i][a[n]])); printf("%d\n",mini);
return ;
} int
main()
{
while(true)
{
pre();
n=;
scanf("%d",&a[n]);
if(a[n]==) break;
init();
dp();
}
return ;
}

[LA] 2031 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. 递推DP UVA 1291 Dance Dance Revolution

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

  3. Dance Dance Revolution

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

  4. LA 2031

    Mr. White, a fat man, now is crazy about a game named ``Dance, Dance, Revolution". But his danc ...

  5. UVALive - 2031 Dance Dance Revolution 三维dp

    题目大意:有一个胖子在玩跳舞机.刚開始的位置在(0,0).跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则 1.假设从0位置移动到随意四个位置,消耗能量2 2.假设从非0位置跳到相邻 ...

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

  7. UVA 1291 Dance Dance Revolution(DP)

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

  8. TCP/UDP端口列表

    http://zh.wikipedia.org/wiki/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1%A8 TCP/UDP端口列表     本条目可通过翻译外语维 ...

  9. TCP/UDP 常用端口列表

    计算机之间依照互联网传输层TCP/IP协议不同的协议通信,都有不同的对应端口.所以,利用短信(datagram)的UDP,所采用的端口号码不一定和采用TCP的端口号码一样.以下为两种通信协议的端口列表 ...

随机推荐

  1. CCI_chapter 4 trees and Grapths

    4.1Implement a function to check if a tree is balanced For the purposes of this question,a balanced ...

  2. bzoj3039 玉蟾宫

    Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...

  3. 深入浅出 消息队列 ActiveMQ

    http://blog.csdn.net/jwdstef/article/details/17380471

  4. Spring整合Shiro做权限控制模块详细案例分析

    1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...

  5. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  6. Android : 如何在WebView显示的页面中查找内容

    Android : 如何在WebView显示的页面中查找内容 Author : Aoyousatuo Zhao http://blog.sina.com.cn/aoyousatuo WebView是A ...

  7. mysql学习之五:sql语句学习3

    好吧,大家认为这样的字体还是比較好看,全部我们就换这样的字体了. INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) ...

  8. MySQL复制协议

    http://hamilton.duapp.com/detail?articleId=27

  9. C# 对象深复制

    Mark: //实现IClonable接口并重写Clone方法就可以实现深克隆了 #region ICloneable 成员 public object Clone() { MemoryStream ...

  10. JavaScript操作剪贴板(转)

    IE是第一个支持与剪贴板相关的事件,以及通过JavaScript访问剪贴板数据的浏览器.IE的实现成为了某种标准,不仅Safari 2.Chrome和Firefox 3也都支持类似的事件和剪贴板(Op ...