ural1143 Electric Path (区间dp)
来源:互联网 发布:浪潮软件重大新闻 编辑:程序博客网 时间:2024/06/06 08:55
黑书1.5.2 例题7 青蛙的烦恼
没找到原题,这个题和原题差不多吧,就是没规定从1开始,可以从任意点开始,难了一点点吧。首先可以证明:最短路径一定没有交叉边,否则还可以更短。这就要求我们i点,只可能跳到i+1,i+len-1两点。这样就有了最优子结构,用dp[0][i][len]表示从i开始,遍历{i..i+len-1}中的顶点一次且仅一次的最短距离。dp[1][i][len]表示从i+len-1开始,遍历{i..i+len-1}中的顶点一次且仅一次的最短距离。则状态转移方程为:
答案为
#include <cstdio>#include <cstring>#include <cmath>#include <iostream>using namespace std;#define N 205int n;double x[N],y[N],dis[N][N],dp[2][N][N];//0--i,1--i+len-1int main(){// freopen("a.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%lf%lf",&x[i],&y[i]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); for(int i=1;i<=n;++i) dp[1][i][1]=dp[0][i][1]=0; for(int len=2;len<=n;++len) for(int i=1;i<=n;++i){ dp[0][i][len]=min(dp[0][(i+1-1)%n+1][len-1]+dis[i][(i+1-1)%n+1],dp[1][(i+1-1)%n+1][len-1]+dis[i][(i+len-1-1)%n+1]); dp[1][i][len]=min(dp[1][i][len-1]+dis[(i+len-1-1)%n+1][(i+len-2-1)%n+1],dp[0][i][len-1]+dis[i][(i+len-1-1)%n+1]); } double ans=1000000000.0; for(int i=1;i<=n;++i) if(dp[0][i][n]<ans) ans=dp[0][i][n]; printf("%.3lf\n",ans); return 0;}
阅读全文
0 0
- ural1143 Electric Path (区间dp)
- URAL 1143 Electric Path (黑书例题,DP)
- hdu 4105 Electric wave (dp)
- 简单dp hdu-4105-Electric wave
- hdu 4105 Electric wave(dp)
- UVALive 6908Electric Bike(dp)
- UVALive 6908 Electric Bike dp,BFS
- ural 1143. Electric Path 凸多边形哈密顿回路
- 区间DP
- 区间DP
- 区间DP
- 区间DP
- ##区间dp##
- 区间dp
- 区间DP
- 区间dp
- 区间dp
- 区间dp
- Java 静态绑定与动态绑定
- nb物联网 bc95模块联网
- 5.1.7—二叉树的遍历—Recover Binary Sear Tree
- spring mav创建和注销session
- 5.1.8—二叉树的遍历—Same Tree
- ural1143 Electric Path (区间dp)
- 在APP中播放音频文件
- 5.1.9—二叉树的遍历—Symmetric Tree
- HTTPS 服务搭建相关概念
- 卷积神经网络
- 5.1.10—二叉树的遍历—Balanced Binary Tree
- Java内存回收与分配
- 5.1.11—二叉树的遍历—Flatten Binary Tree to Linked List
- ?