Problem

题意如紫书,关于cost的计算感觉有些紫书上给的翻译不太好理解:本次无动作cost为0,本次动作和上次动作不一条腿cost为1,本次和上次动作同一条腿,没有涉及移动(只是踩了一下)cost为3,本次和上次动作同一条腿,本次为相邻移动和相对移动时cost分别为5和7。

Solution

  • 条件较多,d(i,a,b,s)表示踩了前i个,当前左右脚在a,b,上次的移动状态为s时以后还会产生的最小代价。倒推,最终答案为d(0,1,2,0)。
  • 代码借鉴了网上高质量的代码,详见注释。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 105,inf = 1e5,Left = 1,Right = 2;//0123 上左右下
int d[maxn][4][4][3],pos[260],action[maxn][4][4][3];
char mov[10];
string str;
int Cost(int a,int ta)//两次同一只脚动作
{if(a==ta) return 3;//本次没有移动 if(a+ta==3) return 7;//本次移动到相对位置 return 5;//本次移动到相邻位置 }
int energy(int a,int b,int s,int f,int t,int &ta,int &tb)//f=0,1,2:本次不动,移左脚,移右脚
{if(f==1) ta = t;if(f==2) tb = t;if(ta==tb) return -1;//移动之后两脚在同一位置 if(ta==Right&&tb==Left) return -1; //移动之后背对跳舞机if(a==Right&&tb!=b||b==Left&&ta!=a) return -1;//左脚在右但移动了右脚或右脚在左但移动了左脚int e = 0;//以下计算本次移动代价 if(f==0) e = 0;//本次不移动代价为0 else if(f!=s) e = 1;//和上次移动不是同一只脚代价为1 else if(f==1) e = Cost(a,ta);//计算与上次移动的脚相同时的代价 else e = Cost(b,tb);return e;
}
void update(int i,int a,int b,int s,int f,int t)//移动f脚至t
{int ta = a,tb = b;int e = energy(a,b,s,f,t,ta,tb);if(e==-1) return ;int cost = d[i+1][ta][tb][f]+e;int &ans = d[i][a][b][s];if(ans>cost){ans = cost;action[i][a][b][s] = f*4+t;}
}
void work()
{int n = str.length();memset(d,0,sizeof(d)); for(int i=n-1;i>=0;i--){for(int a=0;a<=3;a++){for(int b=0;b<=3;b++){if(a==b) continue;for(int s=0;s<4;s++){d[i][a][b][s] = inf; if(str[i]=='.'){update(i,a,b,s,0,0);//不动 for(int t=0;t<4;t++){update(i,a,b,s,1,t);//左脚移动到t update(i,a,b,s,2,t);//右脚移动到t }}else{//左右脚分别一致目标 update(i,a,b,s,1,pos[str[i]]);update(i,a,b,s,2,pos[str[i]]);} }}}}   int a = 1,b = 2,s = 0;for(int i=0;i<n;i++){int f = action[i][a][b][s]/4,t = action[i][a][b][s]%4;cout<<mov[f];if(f==1) a = t;if(f==2) b = t;s = f;}cout<<endl;
}
int main()
{//  freopen("1.txt","w",stdout);pos['U'] = 0;pos['L'] = 1;pos['R'] = 2;pos['D'] = 3;mov[0] = '.';mov[1] = 'L';mov[2] = 'R';while(cin>>str&&str!="#"){work();}return 0;
}

跳舞机(Tango Tango Insurrection, UVa 10618)相关推荐

  1. 基于FPGA的跳舞机实现

    本文使用FPGA实现跳舞机.使用verilog语言实现,在ISE下创建的工程. 功能如下: 本设计中输入为上下左右4个按键,输出有数码管和LED灯. 通过对上下左右的按键正确,数码管和LED灯有相应的 ...

  2. 基于FPGA跳舞机实现

    本工程在ISE下创建,使用verilog HDL语言. 实现跳舞机的功能,可以通过开关控制速度,根据VGA显示的内容,按指定的按键,实现分数的统计,同时有背景音乐. 本工程顶层模块下包括10个子模块. ...

  3. 手舞足蹈,跳舞机视频

    http://www.tudou.com/listplay/HGmbKIwoHZI/5apvqmXJGzE.html  Head模式 http://www.tudou.com/listplay/yQB ...

  4. 『杭电1414』银河跳舞机大赛

    Problem Description 怀特先生(见ACM/ICPC Asia Regional 2001, Shanghai)通过他的跳舞机(Dance Dance Revolution,DDR)减 ...

  5. Android源码--不搭的跳舞机

    还是要重申一遍,因为只是转化,所以原j2me的问题,我不会进行修改.所以这个游戏还是那个样,各种不搭,非常不搭...因为实例需要,我在AndroidSprite中添加了几个方法,也修改paint方法. ...

  6. UVA dp题目汇总

    UVa专题练习 A-4 10003 经典dp,可用四边形不等式优化 10029 基础dp,DAG最长路,需高效构图 10032 经典问题.子集和数问题.01背包问题 10036 能否在一个整数序列的每 ...

  7. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

  8. AI一分钟 | 今天,百度又多了一个好基友华为,还互赠了信物;腾讯AI Lab“肢体动作追踪”技术造出了个“AI 尬舞机”

    图片来源:凤凰网科技 一分钟AI 地平线面向智能驾驶和智能摄像头,推出征程和旭日两款嵌入式人工智能视觉芯片. 百度Apollo无人车队雄安开跑,河北省政府与百度宣布将共同筹建AI国家实验室. 搜狗推出 ...

  9. uva 1291 - Dance Dance Revolution ( dp )

    本文出自   http://blog.csdn.net/shuangde800 题目:点击打开链接 题目大意 如上图,这是一个跳舞机,初始状态两个脚都在0,  状态表示为(0, 0), 然后跳舞机会给 ...

最新文章

  1. Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法
  2. 信息系统项目管理师-论文要求
  3. 【pytorch】pytorch-yolov3拍照并保存,进行检测后遍历所有图片并显示图片
  4. boost::io模块ios相关的测试程序
  5. 线性阵列、圆周阵列、曲线阵列
  6. 网络互连与互联网知识点笔记(五)---路由器技术
  7. python学习------面向对象进阶
  8. 如何Ping特定端口号
  9. 举头望明月打计算机术语,与月亮有关的谜语
  10. C语言课后问答题汇总
  11. 看完了 2021 CSS 年度报告,我学到了啥?
  12. ewb交通灯报告和文件_数字电路基础红绿灯实验报告.docx
  13. ImageLoader(UIL)自定义HTTP Header信息
  14. 怎么调整图片的尺寸大小?
  15. 基于java的古诗词生成管理系统
  16. 《计算机网络自顶向下》 Miscellaneous Lab1 Implementing a Reliable Transport Protocol(实现可靠的传输协议(上))
  17. Spring中@Value注解详解
  18. 【FFmpeg杂记】音频解码输出PCM格式数据分析
  19. 美团脱颖而出的经验_使用条件格式使重要的Outlook邮件脱颖而出
  20. Apache中 RewriteRule 规则参数介绍

热门文章

  1. caoz:创业公司如何做好信息安全
  2. java 加密工具包_Java加密和解密算法调用工具包
  3. idea:通过端口 1433 连接到主机 1433 的 TCP/IP 连接失败
  4. 一文带你了解WeakHashMap
  5. 详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用
  6. 最有效的萨克斯弱音器_一种萨克斯弱音器的制作方法
  7. elementUI table 给表头添加气泡显示
  8. 记录测试数据的bat脚本
  9. 16 声音检测算法的封装
  10. P0级重大事故:超卖了100瓶飞天茅台,整个项目组慌了