HDU5259(百度之星复赛1002)——弹吉他(DP)
来源:互联网 发布:python 静态属性 编辑:程序博客网 时间:2024/04/29 16:29
题目连接
题目分析
这是一道比较典型的DP题目,但是题目的状态数量比较多,转移数量也比较多,所以枚举起来会比较麻烦,所以可以用一个技巧就是可以预处理出所有的序列然后用序列枚举状态转移,这样会使代码简洁很多。
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>using namespace std;typedef long long LL;const int MOD = 1e9 + 7;const int INF = 10000000;const int N = 5000 + 10;struct State { int a[4], b[4]; // void read() { for(int i = 0; i < 4; i++) { scanf("%d%d", &a[i], &b[i]); } }} s[N];int seq[30][4], dp[N][30];bool check(int b[], int q[]) { //序号大的手指所处的品位不能小于序号小的手指 for(int i = 1; i < 4; i++) { if(b[q[i]] < b[q[i - 1]]) return false; } return true;}int calc(State& A, State& B, int q0[], int q1[]) { int dis = 0; for(int i = 0; i < 4; i++) { dis += abs(A.a[q0[i]] - B.a[q1[i]]); dis += abs(A.b[q0[i]] - B.b[q1[i]]); } return dis;}int main() {#ifdef TYH freopen("in.txt", "r", stdin);#endif // TYH int T, C = 1, n; int A[4] = {0, 1, 2, 3}; int nq = 0; do { for(int i = 0; i < 4; i++) seq[nq][i] = A[i]; nq ++; } while(next_permutation(A, A + 4)); scanf("%d", &T); while(T--) { printf("Case #%d:\n", C++); scanf("%d" , &n); for(int i = 1; i <= n; i++) { s[i].read(); } for(int i = 0; i < 4; i++) s[0].b[i] = i + 1, s[0].a[i] = 0; for(int i = 0; i < 24; i++) { if(check(s[1].b, seq[i])) { dp[1][i] = calc(s[0], s[1], seq[0], seq[i]); } else { dp[1][i] = INF; } } for(int i = 2; i <= n; i++) { for(int j = 0; j < 24; j++) { dp[i][j] = INF; if(!check(s[i].b, seq[j])) continue; for(int k = 0; k < 24; k++) { if(dp[i - 1][k] == INF) continue; dp[i][j] = min(dp[i][j], dp[i - 1][k] + calc(s[i - 1], s[i], seq[k], seq[j])); } } } int ans = INF; for(int i = 0; i < 24; i++) { ans = min(ans, dp[n][i]); } printf("%d\n", ans); } return 0;}
0 0
- HDU5259(百度之星复赛1002)——弹吉他(DP)
- hdu5262 最强密码 百度之星复赛 DP
- 百度之星复赛--Pokémon GO----dp
- 百度之星复赛--Valley Numer----数位dp
- 2017 百度之星 复赛 Valley Numer(数位dp)
- hdu 5713 K个联通块 2016百度之星复赛1002 DP
- [百度之星复赛T5]
- 百度之星复赛题解
- 2017百度之星 复赛
- 2014百度之星复赛解题报告复赛:Race
- HDU 5713 K个联通块 状压dp枚举子集 (2016百度之星复赛)
- 2017百度之星复赛:1006. Valley Numer(数位DP)
- HDU 6148 && 2017 百度之星复赛 1005 Valley Numer(数位dp)
- 2017百度之星复赛 hdu 6148 Valley Numer (数位dp)
- 【HDU6146】【2017百度之星复赛-C】Pokémon GO(动态规划)(dp)
- HDU5258(百度之星复赛1001)——数长方形(暴力)
- 赛题集锦—2008年百度之星程序设计大赛复赛题目
- 2007年百度之星复赛试题
- 简记最新expect安装
- TinyDBCluster Vs routing4db
- C++——vector操作
- 类设计技巧
- tomcat结合nginx使用小结
- HDU5259(百度之星复赛1002)——弹吉他(DP)
- C# +AO获取线段中点
- 文档生成框架
- java 字符串拼接的单元测试
- POJ3233 Matrix Power Series 矩阵快速幂+二分求和
- 段错误与总线错误
- jquery验证表单插件
- HCE AID选择策略测试
- oracle中prior的用法,connect by prior,树形目录