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. ImageView显示不出来图片

    问题?? 用ImageView控件方法:public void setImageBitmap(Bitmap bm)来显示生成的bimap,结果在图片显示区域显示一片空白,而且其他控件颜色没变化,造成I ...

  2. Qt Lite

    http://blog.qt.io/blog/2016/08/18/introducing-the-qt-lite-project-qt-for-any-platform-any-thing-any- ...

  3. HP的笔记本经常蓝屏崩溃 -------athr.sys

    因为windows 7才新装不久,没有时间下载配置什么符号表,直接临时下载了WinDbg分析下Dump文件, Probably caused by : athr.sys ( athr+428a5 ) ...

  4. Linux企业级项目实践之网络爬虫(7)——DNS解析

    DNS 是Domain Name Service的缩写.域名系统为Internet上的主机分配域名地址和IP地址.IP地址不易于记忆,然而域名地址相比较而言是方便于记忆的.用户如果使用域名地址,当想获 ...

  5. 【转】如何解决Ubuntu终端里面显示路径名称太长

    原文网址:http://jingyan.baidu.com/article/3d69c5516c129df0ce02d77b.html Ubuntu 默认的终端下面,进入很多层的目录后,前面那个提示符 ...

  6. ubuntu记录

    1. gleboneblack OMAPES=4.x ANDROID_ROOT_DIR=$HOME/aosp W=1 install /bin/sh: 5: ./install.sh: Permiss ...

  7. MVC4.0 上传Excel并存入数据库

    这里的这个功能实现在WebForm很好实现,上传阶段简单的一个FileUoLoad控件就搞定了,什么取值,什么上传都是浮云,微软都帮我们封装好了,我们只需要一拖一拽就OK了,但这些在MVC中是不行的! ...

  8. AS3给显示对象加边框

    给显示对象加边框,可以有以下三种方法1.根据相交路径的缠绕规则的奇偶规则法(使用奇偶缠绕规则时,任何相交路径都交替使用开放填充与闭合填充.如果使用同一填充绘制的两个正方形相交,则不会填充相交的区域.通 ...

  9. 移动web开发研究

    1.jQuery Mobile jQuery Mobile框架能够帮助你快速开发出支持多种移动设备的Mobile应用用户界面.jQuery Mobile最新版本是1.4.0,默认主题采用扁平化设计风格 ...

  10. HDU--3487 Play with Chain (Splay伸展树)

    Play with Chain Problem Description YaoYao is fond of playing his chains. He has a chain containing ...