UVA1347(Tour)(DAG上的动态规划)

这篇博客介绍了UVA1347题目的解决思路,主要涉及动态规划在有向无环图(DAG)上的应用。难点在于状态的定义,即如何表示两个人分别到达不同节点的状态。作者选择dp(i,j)表示第一个人到达i点,第二个人到达j点,且所有编号小于max(i,j)的节点都被访问过。状态转移方程为dp[i][j]=min(dp[i+1][j]+dist(i,i+1),dp[i+1][i]+dist(j,i+1)),递归起点是dp[2][1],边界条件为dp[n-1][j],最终答案为dp[2][1]+dist(1,2),算法的时间复杂度为O(n^2)。" 125329991,10003706,Salesforce开发:公式、验证与流程自动化,"['Salesforce开发', '自动化流程', '数据库管理']
摘要由CSDN通过智能技术生成

UVA1347(Tour)(DAG上的动态规划)

本题的难点主要在于状态的定义,即如何去表示节点的状态。

在紫书中,作者选择了dp(i,j)来表示第一个人走到了i点,第二个人走到了j点,且编号小于max(i,j)的节点都被走过。因为dp[i][j]和dp[j][i]是重复的,因此规定i>j。这样可以保证无后效性,因为小于max(i,j)的点都被选过了,接下来就是在大于max(i,j)里面选点,所以之后的状态不会影响到前面的状态。

接下来考虑状态如何转移,由于状态的定义,下一步只能向编号大于i的节点移动,那么可以是第一个人向前走一步,或者第二个人向前走一步。从而得到状态转移方程:
dp[i][j]=min(dp[i+1][j]+dist(i,i+1),dp[i+1][i]+dist(j,i+1)),其中dist表示两点间的欧几里得距离。

递归起点是dp[2][1]。递归边界时dp[n-1][j],因为此时只剩下最后一个点没有经过,且dp[n-1][j]=dist(n-1,n)+dist(j,n)。

自然,ans=dp[2][1]+dist(1,2)。时间复杂度O为(n2)

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n;
int x[1005];
int y[1005];
double dp[1005][1005];
double dist(int a,int b)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值