SOJ 2818_QQ音速
【题意】两只手,一次只能用一只手按一个键子(0,1,2,3),给出从i键到j键所需的消耗的体力,求依次按下一系列键子所需最小体力。
【分析】
法一:开一个三维数组,分别记录移动到位置及左右手按的键子。
状态转移方程;
v[k][i][j]=min(v[k-1][c[k-1]-'0'][j]+w[c[k-1]-'0'][i],v[k-1][i][c[k-1]-'0']+w[c[k-1]-'0'][j]);其中k取遍0.1.2.3
【代码】
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000050;
int v[maxn][4][4];
int w[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,2},{2,1,2,0}};
int Min;
char c[maxn];
const int INF=0x3fffffff;
int main (void)
{
while(scanf("%s",c)==1)
{
Min=INF;
int len=strlen(c);
memset(v,10,sizeof(v));
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
v[0][i][j]=w[3][j]+w[2][i]; for(int k=1;k<len;k++)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
v[k][i][j]=min(v[k-1][c[k-1]-'0'][j]+w[c[k-1]-'0'][i],v[k-1][i][c[k-1]-'0']+w[c[k-1]-'0'][j]);
}
}
for(int i=0;i<4;i++)
{
Min=min(v[len-1][i][c[len-1]-'0'],Min);
Min=min(v[len-1][c[len-1]-'0'][i],Min);
}
printf("%d\n",Min);
}
return 0;
}
法二:开一个二维数组,分别记录移动的次数及对于某一只手来说该次移动所按的键子(注意边界
状态转移方程:
对于j取遍0,1,2,3
当j==c[i-1]-'0'时
for(int k=0;k<4;k++)
v[i][j]=min(v[i][j],v[i-1][k]+w[k][c[i]-'0']);(j==c[i-1]-'0'
当j!=c[i-1]-'0时 v[i][j]=v[i-1][j]+w[c[i-1]-'0'][c[i]-'0'];
【代码】
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000050;
int v[maxn][4];
int w[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,2},{2,1,2,0}};
int Min,len;
char c[maxn];
const int INF=0x3fffffff;
int main (void)
{
while(scanf("%s",c)==1)
{
Min=INF;
len=strlen(c);
for(int i=0;i<maxn;i++)
for(int j=0;j<4;j++)
v[i][j]=INF;
v[0][2]=w[3][c[0]-'0'];
v[0][3]=w[2][c[0]-'0'];
for(int i=1;i<len;i++)
{
for(int j=0;j<4;j++)
{
if(j==c[i-1]-'0')
{
for(int k=0;k<4;k++)
v[i][j]=min(v[i][j],v[i-1][k]+w[k][c[i]-'0']);
}
else
v[i][j]=v[i-1][j]+w[c[i-1]-'0'][c[i]-'0'];
}
}
for(int i=0;i<4;i++)
Min=min(v[len-1][i],Min);
printf("%d\n",Min);
}
return 0;
}
SOJ 2818_QQ音速的更多相关文章
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- 【贪心】SOJ 13983
SOJ 13983. Milk Scheduling 这是比赛题,还是作死的我最讨厌的英文题,题目大意就是有n头奶牛,要在喂奶截止时间前给他喂奶并得到相应的含量的牛奶. 一开始的想法就是挑选截止日期的 ...
- IC封装图片认识(二):SOP&SOJ
SOP SOP-EIAJ-TYPE-II-14L SSOP SSOP-16L TSOP(Thin Small Outline Package) TSSOP(Thin Shrink Outline Pa ...
- SOJ 1685:chopsticks(dp)
题目链接 说实话挺喜欢soj的界面,简简单单,没有多余的东西hhh(但是简单到连内存限制,时间限制都看不到了. 题意是有个“奇葩”的主人公,吃饭要用三根筷子.两根短的一根长的. 现在给你n根筷子,要在 ...
- LaunchFaster 启动器工具 - 类似 Rolan 和音速启动的图标式快捷启动软件
LaunchFaster 启动器是本人近期编写的一款windows平台上快速启动应用的开源工具软件. LaunchFaster 启动器是一款类似于 Rolan 和 音速启动 和 Lily 的图标形式的 ...
- SOJ 4552 [期望,概率]
题目链接:[http://acm.scu.edu.cn/soj/problem.action?id=4552] 题意:给你n种卡牌,每种卡牌有无限多个,每次从中抽取一张卡牌,问:1.集齐这n种卡牌需要 ...
- 开发类似"音速启动"的原创工具简码"万能助手"的过程中对ztree.js与win标准控件treeview、HTMLayout树形框等优缺点的比较
在开发类似"音速启动"的桌面快捷方式管理软件简码"万能助手"的早期规划中,曾经考虑过几种树形框方案: ztree.js.win标准控件treeview.HTML ...
- soj 131 找题
soj 131 找题 给出两个长度为n,都含k个1的字符串A,B.现在令\(a_1,a_2,\dots,a_k\)是A中1的下标,\(b_1,b_2,\dots,b_k\)是B中1的下表,然后将a,b ...
- SOJ 4482 忽悠大神【最小生成树】
题目链接: http://acm.scu.edu.cn/soj/problem.action?id=4482 题意: 给定边权和点权,从一个点出发并回到该点,减少尽量多的边,每路过点和边都要把权重加到 ...
随机推荐
- c#中stringbuilder的方法总结
String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新 ...
- 用idea+maven编译打包spark project core错误:java.lang.RuntimeException: Unable to load a Suite class
Discovery starting. *** RUN ABORTED *** java.lang.RuntimeException: Unable to load a Suite class tha ...
- iOS programming UITabBarController
iOS programming UITabBarController 1.1 View controllers become more interesting when the user's acti ...
- 使用VC++编写QQ群发器,MFC做UI
由于公司业务需要,QQ群发器经常被用来发送QQ广告,购买的QQ群发器不好用不说,而且是按机器收费的,有些功能还不能修改. 所以公司派我来开发一款自己的QQ群发器,我给群发器取名叫做飞速群发器,用来给软 ...
- UI概念体系要素
结构.渲染.交互.数据. 要素.呈现.交互 1)UI(组成)要素:结构 2)布局: 3)渲染: 4)事件处理: 5)数据:
- Discuz!代码
我如何使用Discuz!代码 Discuz!代码 效果 [b]粗体文字 Abc[/b] 粗体文字 Abc [i]斜体文字 Abc[/i] 斜体文字 Abc [u]下划线文字 Abc[/u] 下划线 ...
- 排序算法小结:C++实现
#include<vector> #include<iostream> //排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排 ...
- Python入门之类(class)
面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到 ...
- Python学习-列表的修改,删除操作
列表的修改操作 列表中的许多操作和字符串中有许多的相同点,因为列表是一个有顺序可变的元素集合,所以在列表中可以进行增加,删除,修改,查找的操作. 列表的修改操作: 如果你想单个修改列表中的某一个元素, ...
- HTML5地理定位-Geolocation API
HTML5提供了一组Geolocation API,来自navigator定位对象的子对象,获取用户的地理位置信息Geolocation API使用方法:1.判断是否支持 navigator.geol ...