LightOJ 1057 - Collecting Gold (状压dp)
2015-11-21 04:22
459 查看
题意:
n∗m(n,m<20)的格子里有最多15个格子有金子,x是出发点,求出发并回来拿完金子的最短路程
分析:
一开始dp[x][y][s]:=在(x,y)金子状态为s的最短路程,然后空间炸了
然后就卡死了−−其实加上x包括15个金子看成tsp问题就好了,然后获得两个金子的路程,直接曼哈顿距离,因为是8个方向
状态dp[p][s]:=在哪个位置(x或者金子),x或者金子的状态为s的最短路程,然后就很裸了
代码:
n∗m(n,m<20)的格子里有最多15个格子有金子,x是出发点,求出发并回来拿完金子的最短路程
分析:
一开始dp[x][y][s]:=在(x,y)金子状态为s的最短路程,然后空间炸了
然后就卡死了−−其实加上x包括15个金子看成tsp问题就好了,然后获得两个金子的路程,直接曼哈顿距离,因为是8个方向
状态dp[p][s]:=在哪个位置(x或者金子),x或者金子的状态为s的最短路程,然后就很裸了
代码:
// // Created by TaoSama on 2015-11-20 // Copyright (c) 2015 TaoSama. All rights reserved. // //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " " #define prln(x) cout << #x << " = " << x << endl const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; int n, m, dp[16][1 << 16]; int g, x[16], y[16]; char s[25][25]; int getdis(int i, int j) { return max(abs(x[i] - x[j]), abs(y[i] - y[j])); } int dfs(int p, int s) { int& ret = dp[p][s]; if(~ret) return ret; if(p == 0 && s == (1 << g) - 1) return 0; ret = INF; for(int i = 0; i < g; ++i) { if(s >> i & 1) continue; ret = min(ret, dfs(i, s | 1 << i) + getdis(p, i)); } return ret; } int main() { #ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin); // freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); int t; scanf("%d", &t); int kase = 0; while(t--) { scanf("%d%d", &n, &m); g = 1; for(int i = 1; i <= n; ++i) { scanf("%s", s[i] + 1); for(int j = 1; j <= m; ++j) { if(s[i][j] == 'x') x[0] = i, y[0] = j; if(s[i][j] == 'g') x[g] = i, y[g++] = j; } } memset(dp, -1, sizeof dp); printf("Case %d: %d\n", ++kase, dfs(0, 0)); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow