题意:有一台跳舞机,中间是0。上左下右分别代表1 2 3 4,初始状态人站在中间。两仅仅脚都踏在0上,然后给出一段序列以0为结束,要按顺序踩出来,从0踏到四个方向须要消耗2点能量,从一个方向到相邻的方向消耗3点能量,从一个方向到对面方向消耗4点能量,在一个方向原地再踩一次消耗1点能量,问把全部序列踩完最少消耗多少能量。

题解:f[i][j][k]表示踩前i步左脚在方向j上右脚在方向k上最少消耗多少能量。那么就要分两种情况讨论:

(1)f[i][j][a[i]] 的前一步是f[i - 1][a[i - 1]][k]或f[i - 1][k][a[i - 1]]。这两种情况再加上这一步移动消耗能量取较小值。

(2)f[i][a[i]][j]和上面相似

结果在f[n][a[n]][k]和f[n][k][a[n]]中取最小值就是解。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 100000;
int n, a[N], f[N][5][5]; int Count(int x, int y) {
if (x == 0)
return 2;
int temp = fabs(x - y);
if (temp == 0)
return 1;
if (temp % 2)
return 3;
return 4;
} int main() {
while (1) {
n = 1;
scanf("%d", &a[n]);
if (a[n] == 0)
break;
while (a[n]) {
n++;
scanf("%d", &a[n]);
}
n--;
memset(f, INF, sizeof(f));
f[0][0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 4; j++) {
if (j != a[i]) {
if (a[i - 1] == j) {
for (int k = 0; k <= 4; k++)
if (k != a[i - 1] || i == 1) {
f[i][j][a[i]] = min(f[i][j][a[i]], f[i - 1][j][k] + Count(k, a[i]));
f[i][a[i]][j] = min(f[i][a[i]][j], f[i - 1][k][j] + Count(k, a[i]));
}
}
else {
f[i][j][a[i]] = min(f[i][j][a[i]], f[i - 1][j][a[i - 1]] + Count(a[i - 1], a[i]));
f[i][a[i]][j] = min(f[i][a[i]][j], f[i - 1][a[i - 1]][j] + Count(a[i - 1], a[i]));
}
}
}
}
int res = INF;
for (int i = 1; i <= 4; i++) {
res = min(res, f[n][i][a[n]]);
res = min(res, f[n][a[n]][i]);
}
printf("%d\n", res);
}
return 0;
}

最新文章

  1. IIS7下使用4.0框架集成模式URLRewriter重写中文URL乱码问题
  2. SQL使用开窗函数与CTE查询每月销售额的前几名
  3. NOIP 2014 pj &amp; tg
  4. 最佳化常用测试函数 Optimization Test functions
  5. codeforces 713D D. Animals and Puzzle 二分+二维rmq
  6. 绿色mysql启动脚本
  7. 保护眼睛,绿豆沙颜色的RGB值和HSL值
  8. mysql导出数据库和恢复数据库代码
  9. 6种基础排序算法java源码+图文解析[面试宝典]
  10. 第三周LINUX学习笔记
  11. gin框架学习手册
  12. 戴尔服务器H330阵列卡取消磁盘阵列教程
  13. 金蝶KIS问题解决汇总
  14. 04: 使用BeautifulSoup封装的xss过滤模块
  15. [javaSE] 并发编程(线程间通信)
  16. C++易混淆概念
  17. 安卓isEmpty()的注意事项,主要判断NULL
  18. bzoj2961&amp;&amp;bzoj4140 共点圆
  19. JQueryMobile开发必须的知道的知识
  20. Codefroces 735D Taxes(哥德巴赫猜想)

热门文章

  1. Ubuntu下访问SSH
  2. [Javascript] The JSON.stringify API
  3. resin安装和配置
  4. SQL 分组获取最近(大)一条记录
  5. ASP.net gridview控件RowEditing,RowUpdating,RowDeleting,RowCancelingEdit事件的触发
  6. WebApi2官网学习记录---Content Negotiation
  7. Server.HTMLEncode用法
  8. oracle包概述(一)【weber出品】
  9. 5 输出的properties文件按照key进行排序
  10. poj3614 贪心