SOJ 2818_QQ音速
2015-11-23 10:06
183 查看
【题意】两只手,一次只能用一只手按一个键子(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
【代码】
法二:开一个二维数组,分别记录移动的次数及对于某一只手来说该次移动所按的键子(注意边界
状态转移方程:
对于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'];
【代码】
【分析】
法一:开一个三维数组,分别记录移动到位置及左右手按的键子。
状态转移方程;
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; }
相关文章推荐
- 我的书单
- 类型
- 使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
- 华为OJ基础篇-iNOC产品部–完全数计算
- Java String.getChars()
- spring + redis 实现数据的缓存
- ios 64位下编译webrtc的libvpx库出现错误Bad cputype for object file.Currently only tested for CPU_TYPE_x86_64
- 平安医保权限管理关系
- 修改servlet的模板代码
- linux消息列队
- android中的帧动画(Frame)+图片自动播放器(ViewFlipper)
- 用例图
- 《Effective JavaScript》- 1.4 原始类型优于封装对象
- maven配置jetty
- 关于“warning LNK4099: 未找到 PDB“vc90.pdb”的解决办法
- Memcached在使用中常用到的方法
- btrfs-snapper 实现Linux 文件系统快照回滚
- 信息安全系统设计基础实验二:固件设计
- 手势识别事件详解
- 修改服务器数据库密码