博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1964 Pipes
阅读量:5951 次
发布时间:2019-06-19

本文共 3906 字,大约阅读时间需要 13 分钟。

HDU_1964

    这个题目只需要把求回路数量的dp方程改写成取最优解的dp方程即可。

    更多和插头dp相关的题目可以参考胡浩的博客:

#include
#include
#define MAXD 15#define HASH 30007#define SIZE 1000010#define INF 0x3f3f3f3fint N, M, code[MAXD], ch[MAXD], maze[MAXD][MAXD], rcost[MAXD][MAXD], dcost[MAXD][MAXD];char b[50];struct Hashmap{ int head[HASH], next[SIZE], state[SIZE], f[SIZE], size; void init() { memset(head, -1, sizeof(head)); size = 0; } void push(int st, int ans) { int i, h = st % HASH; for(i = head[h]; i != -1; i = next[i]) if(state[i] == st) { if(ans < f[i]) f[i] = ans; return ; } state[size] = st, f[size] = ans; next[size] = head[h]; head[h] = size ++; }}hm[2];void decode(int *code, int m, int st){ int i; for(i = m; i >= 0; i --) { code[i] = st & 7; st >>= 3; }}int encode(int *code, int m){ int i, cnt = 0, st = 0; memset(ch, -1, sizeof(ch)); ch[0] = 0; for(i = 0; i <= m; i ++) { if(ch[code[i]] == -1) ch[code[i]] = ++ cnt; code[i] = ch[code[i]]; st <<= 3; st |= code[i]; } return st;}void init(){ int i, j, k; gets(b), sscanf(b, "%d%d", &N, &M); memset(maze, 0, sizeof(maze)); for(i = 1; i <= N; i ++) for(j = 1; j <= M; j ++) maze[i][j] = 1; gets(b); for(i = 1; i < 2 * N; i ++) { gets(b); if(i & 1) { for(j = 1, k = 2; k < 2 * M; j ++, k += 2) rcost[(i + 1) >> 1][j] = b[k] - '0'; } else { for(j = 1, k = 1; k < 2 * M; j ++, k += 2) dcost[i >> 1][j] = b[k] - '0'; } } gets(b);}void shift(int *code, int m){ int i; for(i = m; i > 0; i --) code[i] = code[i - 1]; code[0] = 0;}void dpblank(int i, int j, int cur){ int k, left, up, t; for(k = 0; k < hm[cur].size; k ++) { decode(code, M, hm[cur].state[k]); left = code[j - 1], up = code[j]; if(left && up) { if(left == up) { if(i == N && j == M) { code[j - 1] = code[j] = 0; shift(code, M); hm[cur ^ 1].push(encode(code, M), hm[cur].f[k]); } } else { code[j - 1] = code[j] = 0; for(t = 0; t <= M; t ++) if(code[t] == up) code[t] = left; if(j == M) shift(code, M); hm[cur ^ 1].push(encode(code, M), hm[cur].f[k]); } } else if(left || up) { if(maze[i][j + 1]) { code[j - 1] = 0, code[j] = left + up; hm[cur ^ 1].push(encode(code, M), hm[cur].f[k] + rcost[i][j]); } if(maze[i + 1][j]) { code[j - 1] = left + up, code[j] = 0; if(j == M) shift(code, M); hm[cur ^ 1].push(encode(code, M), hm[cur].f[k] + dcost[i][j]); } } else { if(maze[i][j + 1] && maze[i + 1][j]) { code[j - 1] = code[j] = 13; hm[cur ^ 1].push(encode(code, M), hm[cur].f[k] + rcost[i][j] + dcost[i][j]); } } }}void solve(){ int i, j, cur = 0, ans = INF; hm[cur].init(); hm[cur].push(0, 0); for(i = 1; i <= N; i ++) for(j = 1; j <= M; j ++) { hm[cur ^ 1].init(); dpblank(i, j, cur); cur ^= 1; } for(i = 0; i < hm[cur].size; i ++) if(hm[cur].f[i] < ans) ans = hm[cur].f[i]; printf("%d\n", ans);}int main(){ int t; gets(b), sscanf(b, "%d", &t); while(t --) { init(); solve(); } return 0;}

转载地址:http://nusxx.baihongyu.com/

你可能感兴趣的文章
Harmonic Number (II)
查看>>
长连接、短连接、长轮询和WebSocket
查看>>
day30 模拟ssh远程执行命令
查看>>
做错的题目——给Array附加属性
查看>>
Url.Action取消字符转义
查看>>
JQuery选择器大全
查看>>
Gamma阶段第三次scrum meeting
查看>>
python3之装饰器修复技术@wraps
查看>>
[考试]20150606
查看>>
Javascript_备忘录5
查看>>
Can’t create handler inside thread that has not called Looper.prepare()
查看>>
敏捷开发方法综述
查看>>
Hadoop数据操作系统YARN全解析
查看>>
Django 运行报错 ImportError: No module named 'PIL'
查看>>
修改数据库的兼容级别
查看>>
Windows下同时安装两个版本Jdk
查看>>
uoj#228. 基础数据结构练习题(线段树)
查看>>
JS键盘事件监听
查看>>
ios开发周期之--(向上,向下,四舍五入)取整
查看>>
加油!
查看>>