URAL 1143 Electric Path(带方向的区间DP + 记忆化搜索)
2013-04-04 00:12
513 查看
题意:
有 n 个点,他们正好形成一个凸多边形,从某个点开始,且只经过每个点一次,就最终的最短路径。
黑书 133 面,烦恼的青蛙。差不多一样的题目。
思路:
1. 首先路径不能相交,只有不相交的情况下才能找到最短路径;
2. dp[s, L, 0] 表示从 s 点出发,经过 L 个点,最终的最短路径,由 1 可以确定的是:这 L 个点肯定是相邻的;
dp[s, L, 1] 表示从 s + L - 1 点出发,经过 L 个点,最终的最短路径;
3. 上述可以理解成带方向的区间DP,比如区间为[0, n-1],因为路径不能相交,所以考虑是从 0 出发还是从 n-1 出发,然后逐步缩小区间,达到求解的目的;
4. 如果从 1 出发,则只能访问 2 或者 n 才能达到最优,最终可以利用记忆化搜索完美解决;
有 n 个点,他们正好形成一个凸多边形,从某个点开始,且只经过每个点一次,就最终的最短路径。
黑书 133 面,烦恼的青蛙。差不多一样的题目。
思路:
1. 首先路径不能相交,只有不相交的情况下才能找到最短路径;
2. dp[s, L, 0] 表示从 s 点出发,经过 L 个点,最终的最短路径,由 1 可以确定的是:这 L 个点肯定是相邻的;
dp[s, L, 1] 表示从 s + L - 1 点出发,经过 L 个点,最终的最短路径;
3. 上述可以理解成带方向的区间DP,比如区间为[0, n-1],因为路径不能相交,所以考虑是从 0 出发还是从 n-1 出发,然后逐步缩小区间,达到求解的目的;
4. 如果从 1 出发,则只能访问 2 或者 n 才能达到最优,最终可以利用记忆化搜索完美解决;
#include <iostream> #include <algorithm> using namespace std; const int MAXN = 210; double dis[MAXN][MAXN], x[MAXN], y[MAXN]; double dp[MAXN][MAXN][2]; int n; inline double getdist(int i, int j) { return sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j])); } double solvedp(int s, int l, int f) { if (dp[s][l][f] != 1e20) return dp[s][l][f]; if (f == 0) { dp[s][l][0] = solvedp((s+1)%n, l-1, 0) + dis[s][(s+1)%n]; dp[s][l][0] = min(dp[s][l][0], solvedp((s+1)%n, l-1, 1) + dis[s][(s+l-1)%n]); } else { dp[s][l][1] = solvedp(s, l-1, 1) + dis[(s+l-1)%n][(s+l-2)%n]; dp[s][l][1] = min(dp[s][l][1], solvedp(s, l-1, 0) + dis[(s+l-1)%n][s]); } return dp[s][l][f]; } int main() { while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%lf%lf", &x[i], &y[i]); for (int i = 0; i < n; i++) for (int j = i; j < n; j++) dis[i][j] = dis[j][i] = getdist(i, j); for (int i = 0; i < n; i++) for (int j = 0; j <= n; j++) dp[i][j][0] = dp[i][j][1] = 1e20; for (int i = 0; i < n; i++) dp[i][1][0] = dp[i][1][1] = 0.0; double ans = 1e20; for (int i = 0; i < n; i++) ans = min(ans, solvedp(i, n, 0)); printf("%.3lf\n", ans); } return 0; }
相关文章推荐
- ural1143 Electric Path (区间dp)
- URAL 1143 Electric Path (黑书例题,DP)
- URAL 1776 Anniversary Firework 概率dp+区间dp
- uva 10453 - Make Palindrome (区间dp,记忆化搜索)
- 记忆化搜索或区间DP——石子合并
- Codeforces 509F Progress Monitoring (区间dp 或 记忆化搜索)
- hdu 4597 Play Game(区间dp,记忆化搜索)
- UVA 1331 Minimax Triangulation 最大面积最小的三角剖分(区间dp--记忆化搜索)
- URAL 1167. Bicolored Horses(二维dp或者记忆化搜索)
- HDU3427 Clickomania【记忆化搜索】【区间DP】
- uva 10453 - Make Palindrome (区间dp,记忆化搜索)
- HDU 5900 QSC and Master (区间dp,记忆化搜索)
- HDU 2476 区间DP--转移思考方向
- URAL - 2018 The Debut Album(状态dp 记忆化搜索)
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
- BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】
- [CDOJ1321]-区间DP(记忆化搜索)
- BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】
- HDU4571-区间DP,记忆化搜索,递推