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

本文共 3987 字,大约阅读时间需要 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;}

转载于:https://www.cnblogs.com/staginner/archive/2012/04/20/2458695.html

你可能感兴趣的文章
SSL 2289——庆功会
查看>>
Linux命令--su与sudo
查看>>
python课堂练习
查看>>
区块链资料高清PDF合集
查看>>
xml实现AOP
查看>>
bzoj 4237稻草人
查看>>
在发送intent启动activity之前判断是否有activity接收
查看>>
html5特征检测
查看>>
js中几种实用的跨域方法原理详解
查看>>
打印图形
查看>>
《第一行代码》学习笔记7-活动Activity(5)
查看>>
ngx_http_core_module 模块
查看>>
两个常见的oracle索引
查看>>
一位有着工匠精神的博主写的关于IEnumerable接口的详细解析
查看>>
MySQL中特有的函数If函数
查看>>
安装Python3.6.2报错:zipimport.ZipImportError: can't decompress data; zlib not available
查看>>
【蓝桥杯】入门训练 Fibonacci数列
查看>>
实验十 指针2
查看>>
常见HTTP状态码
查看>>
vim 空格和换行的删除和替换
查看>>