递推DP UVA 1291 Dance Dance Revolution
2015-08-15 15:33
375 查看
题目传送门
题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少
分析:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程:(a[i], k) <- min (a[i-1], k) + cost以及(a[i-1], a[i]) <- min (a[i-1], k) + cost, (k, a[i])和(a[i], a[i-1])情况类似,最后再去最小值就行了
收获:四个状态转移方向
代码:
题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少
分析:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程:(a[i], k) <- min (a[i-1], k) + cost以及(a[i-1], a[i]) <- min (a[i-1], k) + cost, (k, a[i])和(a[i], a[i-1])情况类似,最后再去最小值就行了
收获:四个状态转移方向
代码:
/************************************************ * Author :Running_Time * Created Time :2015-8-15 14:31:31 * File Name :UVA_1291.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; const int MAXN = 1e4 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; int a[MAXN]; int dp[MAXN][5][5]; int cal(int x, int y) { int ret; if (x == y) ret = 1; else { if (y == 0) ret = 2; else { if (abs (x - y) == 2) { ret = 4; } else ret = 3; } } return ret; } int main(void) { //UVA 1291 Dance Dance Revolution int n = 0; while (scanf ("%d", &a[++n]) == 1) { if (a[1] == 0) break; while (a != 0) { scanf ("%d", &a[++n]); } n--; memset (dp, INF, sizeof (dp)); dp[1][a[1]][0] = (a[1] == 0 ? 1 : 2); dp[1][0][a[1]] = (a[1] == 0 ? 1 : 2); for (int i=2; i<=n; ++i) { for (int j=0; j<=4; ++j) { int c1 = cal (a[i], j); int c2 = cal (a[i], a[i-1]); int x = a[i], y = a[i-1]; dp[i][x][y] = min (dp[i][x][y], dp[i-1][j][y] + c1); dp[i][j][x] = min (dp[i][j][x], dp[i-1][j][y] + c2); dp[i][y][x] = min (dp[i][y][x], dp[i-1][y][j] + c1); dp[i][x][j] = min (dp[i][x][j], dp[i-1][y][j] + c2); } } int ans = INF; for (int i=0; i<=4; ++i) { ans = min (ans, min (dp [i][a ], dp [a ][i])); } printf ("%d\n", ans); n = 0; } return 0; }
相关文章推荐
- OC-字典&数组运用实例:通讯录的实现
- Access 字段拼接
- C语言中关于 赋值语句X=Y的解析
- startActivityForResult与startActivity
- 算法导论 10.2-6 带哨兵的双向链表合并两个不相交的集合
- 华为OJ(尼科彻斯定理)
- [LeetCode] Palindrome Number
- 理解OAuth 2.0
- Nginx 安装配置 禁止使用IP访问 rewrite重写 别名设置 日志轮询
- 块匹配算法GPU并行化
- Linux学习笔记(19) Linux服务管理
- Andoird的两种应用程序界面构建方式
- python 决策树学习
- 周赛HDU超市服务
- 从图库获取图片
- JAVA实现的单例模式
- 【MySQL集群】——在Windows环境下配置MySQL集群
- 杭州电 1203 I NEED A OFFER!
- jstl表达式的应用的条件
- matlab中repmat函数的用法